对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

身份验证

每个通过 WebSocket 的 STOMP 消息会话都始于一个 HTTP 请求。 该请求可能是升级到 WebSocket 的请求(即 WebSocket 握手), 或者在使用 SockJS 回退机制的情况下,是一系列 SockJS HTTP 传输请求。spring-doc.cadn.net.cn

许多 Web 应用程序已经内置了身份验证和授权机制,用于保护 HTTP 请求。通常,用户通过 Spring Security 使用某种机制(例如登录页面、HTTP 基本身份验证或其他方式)进行身份验证。已认证用户的安全上下文会保存在 HTTP 会话中,并与同一基于 Cookie 的会话中的后续请求相关联。spring-doc.cadn.net.cn

因此,对于 WebSocket 握手请求或 SockJS HTTP 传输请求,通常已经可以通过 HttpServletRequest#getUserPrincipal() 获取到已认证的用户。Spring 会自动将该用户与为其创建的 WebSocket 或 SockJS 会话关联起来,并随后通过用户头(user header)将其与通过该会话传输的所有 STOMP 消息关联。spring-doc.cadn.net.cn

简而言之,一个典型的Web应用程序在安全性方面无需做任何超出其已有操作之外的事情。用户在HTTP请求级别通过一个安全上下文进行身份验证,该上下文通过基于Cookie的HTTP会话进行维护(随后与为该用户创建的WebSocket或SockJS会话相关联),并导致每个流经应用程序的Message都会被打上用户头信息。spring-doc.cadn.net.cn

STOMP 协议确实在 login 帧中包含 passcodeCONNECT 头部。 这些头部最初是为基于 TCP 的 STOMP 设计的,并且在该场景下是必需的。然而,对于基于 WebSocket 的 STOMP,Spring 默认会忽略 STOMP 协议层的认证头部,并假定用户已在 HTTP 传输层完成身份认证。 预期 WebSocket 或 SockJS 会话中已包含经过认证的用户信息。spring-doc.cadn.net.cn