认证

每个基于 WebSocket 的 STOMP 消息会话都以一个 HTTP 请求开始。这可以是升级到 WebSocket 的请求(即 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 帧上确实有 loginpasscode 头。这些最初是为 STOMP over TCP 设计的,并且是必需的。然而,对于 STOMP over WebSocket,默认情况下,Spring 会忽略 STOMP 协议级别的身份验证头,并假定用户已在 HTTP 传输级别进行身份验证。预期是 WebSocket 或 SockJS 会话包含已验证的用户。

© . This site is unofficial and not affiliated with VMware.