認證

每個基於 WebSocket 的 STOMP 訊息會話都以一個 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 WebSocket,預設情況下,Spring 會忽略 STOMP 協議級別的身份驗證頭,並假定使用者已在 HTTP 傳輸級別進行身份驗證。預期是 WebSocket 或 SockJS 會話包含已驗證的使用者。

© . This site is unofficial and not affiliated with VMware.