認證

每個基於 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 頭。這些最初是為基於 TCP 的 STOMP 設計並必需的。然而,對於基於 WebSocket 的 STOMP,Spring 預設忽略 STOMP 協議層面的認證頭,並假定使用者已在 HTTP 傳輸層面進行認證。期望是 WebSocket 或 SockJS 會話包含已認證使用者。