认证

每个STOMP over WebSocket消息会话都始于一个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帧上有loginpasscode标头。这些最初是为STOMP over TCP设计并且在STOMP over WebSocket中是必需的。然而,默认情况下,Spring会忽略STOMP协议级别的身份验证标头,并假定用户已经在HTTP传输级别上进行了身份验证。期望是WebSocket或SockJS会话包含经过身份验证的用户。