跳到主要内容

认证

ChatGPT-4o-mini 中英对照 Authentication

每个 STOMP over WebSocket 消息会话都以一个 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 TCP 中是必需的。然而,对于 STOMP over WebSocket,默认情况下,Spring 会忽略 STOMP 协议层的身份验证头,并假设用户已经在 HTTP 传输层进行了身份验证。预期是 WebSocket 或 SockJS 会话包含经过身份验证的用户。