身份验证
每个通过 WebSocket 的 STOMP 消息会话都以一个 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 协议在 CONNECT
帧中确实包含 login
和 passcode
头部。这些头部最初是为 STOMP over TCP 设计的,并且是 STOMP over TCP 所必需的。但是,对于 STOMP over WebSocket,默认情况下,Spring 会忽略 STOMP 协议级别的身份验证头部,并假设用户已经在 HTTP 传输级别进行了身份验证。预期 WebSocket 或 SockJS 会话包含已认证的用户。