身份验证
每个基于WebSocket的STOMP消息会话都始于一个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
帧上具有login
和passcode
头。这些最初是为基于TCP的STOMP设计的,并且是必需的。但是,对于基于WebSocket的STOMP,Spring默认情况下会忽略STOMP协议级别的身份验证头,并假设用户已在HTTP传输级别进行身份验证。预期WebSocket或SockJS会话包含已验证的用户。