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

身份验证

每个基于 WebSocket 的 STOMP 消息传输会话都从 HTTP 请求开始。 这可以是升级到 WebSocket 的请求(即 WebSocket 握手) 或者,在 SockJS 回退的情况下,是一系列 SockJS HTTP 传输请求。spring-doc.cadn.net.cn

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

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

简而言之,典型的Web应用程序除了已经做的安全工作外,不需要做其他事情。用户在HTTP请求级别进行身份验证,安全上下文通过基于Cookie的HTTP会话保持(该会话随后与为该用户创建的WebSocket或SockJS会话相关联),并且会导致每个通过应用程序的Message都带有用户头信息。spring-doc.cadn.net.cn

STOMP 协议确实有在 CONNECT 帧上的 loginpasscode 头。 这些最初是为 STOMP over TCP 设计的,并且对于 STOMP over TCP 是必需的。然而,对于 STOMP over WebSocket,默认情况下,Spring 会忽略 STOMP 协议级别的身份验证头,并假设用户已经在 HTTP 传输级别进行了身份验证。 预期是 WebSocket 或 SockJS 会话中包含已认证的用户。spring-doc.cadn.net.cn