对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
认证
每个 STOMP over WebSocket 消息收发会话都以 HTTP 请求开头。 这可以是升级到 WebSockets 的请求(即 WebSocket 握手) 或者,在 Sockjs 回退的情况下,一系列 Sockjs HTTP 传输请求。
许多 Web 应用程序已经进行了身份验证和授权,以便 安全 HTTP 请求。通常,用户通过 Spring Security 进行身份验证 通过使用某些机制,例如登录页面、HTTP 基本身份验证或其他方式。 经过身份验证的用户的安全上下文保存在 HTTP 会话中 ,并与同一基于 Cookie 的会话中的后续请求相关联。
因此,对于 WebSocket 握手或 Sockjs HTTP 传输请求,
通常,已经有一个经过身份验证的用户可通过HttpServletRequest#getUserPrincipal()
.Spring 会自动关联该用户
替换为它们创建的 WebSocket 或 Sockjs 会话,然后,使用所有
通过用户标头通过该会话传输的 STOMP 消息。
简而言之,典型的 Web 应用程序不需要执行任何作
超越了它已经为安全所做的工作。用户通过
具有安全上下文的 HTTP 请求级别,该上下文通过基于 Cookie 的
HTTP 会话(然后与创建的 WebSocket 或 Sockjs 会话相关联
),并导致在每个Message
流动
通过应用程序。
STOMP 协议确实具有login
和passcode
headers 的CONNECT
框架。
这些最初是为 TCP 上的 STOMP 设计的,并且是 STOMP 所必需的。但是,对于 STOMP
默认情况下,Spring 会忽略 STOMP 协议的身份验证标头
级别,并假定用户已在 HTTP 传输级别进行身份验证。
预期是 WebSocket 或 Sockjs 会话包含经过身份验证的用户。