基於SpringBoot的websocket連線訪問控制方案

之前的文章中已經介紹過SpringBoot整合websocket的基本使用

使用SpringBoot搭建實時通訊服務

SpringBoot整合websocket獲取http會話資訊

在實際生產環境中,我們的websocket伺服器一般兒都會設定一定的安全訪問控制策略,不會允許客戶端不經過認證就能同伺服器進行通訊服務,接下來給大家介紹下,透過在websocket建立握手階段,驗證客戶端的相關憑證資訊用以檢測客戶端身份的合法性,來實現伺服器端的安全訪問控制~

SpringBoot版本 2。4。5

工作原理

Spring為我們提供了

HandshakeInterceptor

握手攔截器

基於SpringBoot的websocket連線訪問控制方案

檢視原始碼可以看到HandshakeInterceptor中提供了

beforeHandshake

afterHandshake

兩個方法,它作用在websocket建立連線握手前後階段,透過在

beforeHandshake

方法中返回的布林值,能決定是否允許建立websocket連線,基於此,我們就能實現伺服器的安全訪問控制了

使用方式

修改registerWebSocketHandlers配置,增加HandshakeInterceptor攔截器實現類,來實現自定義的攔截策略

基於SpringBoot的websocket連線訪問控制方案

詳細程式碼參考:https://github。com/netbuffer/spring-boot-websocket-demo/blob/master/src/main/java/cn/netbuffer/springboot/websocket/demo/interceptor/RbacHandshakeInterceptor。java

攔截方案一 基於cookie的攔截策略

編寫基於cookie的攔截方法,從cookie中解析出訪問憑證資訊token值,實際的token值應該基於使用者輸入的相關訪問口令來簽發生成的,要結合所用的shiro、spring security、sa-token等安全認證框架來綜合考慮~,token值是經過安全演算法生成的,不能被偽造,可以使用jwt(json web token)來承載

基於SpringBoot的websocket連線訪問控制方案

編寫前端測試程式碼同伺服器進行通訊

詳細程式碼參考:https://github。com/netbuffer/UItest/blob/master/websocket/index。html

第一次訪問沒有攜帶cookie中的token值,結果會被伺服器拒絕連線

基於SpringBoot的websocket連線訪問控制方案

透過在開發者工具中注入cookie,設定token資訊

基於SpringBoot的websocket連線訪問控制方案

再次訪問前端測試頁面,觀察伺服器日誌輸出,可以看到從cookie中解析出了token值,我們就可以根據token資訊來驗證訪問合法性了

基於SpringBoot的websocket連線訪問控制方案

攔截方案二 基於querystring的攔截策略

透過在websocket連線地址中設定querystring引數,來驗證token值

基於SpringBoot的websocket連線訪問控制方案

前端程式碼先不帶querystring建立連線訪問測試

基於SpringBoot的websocket連線訪問控制方案

觀察伺服器日誌,沒有從querystring中解析出token值,此時會拒絕連線

基於SpringBoot的websocket連線訪問控制方案

再次修改前端程式碼設定querystring值,訪問伺服器測試,觀察伺服器端日誌中已經解析到了token值,據此可以驗證訪問合法性了

基於SpringBoot的websocket連線訪問控制方案

攔截方案三 基於HttpSession的攔截策略

透過檢測HttpSession中使用者的登入態,以及其他相關的web會話資訊,來驗證合法性;這種方式不適用於前後端分離的專案,受限於有HttpSession會話才能完成校驗

基於SpringBoot的websocket連線訪問控制方案

這種方式下,需要在websocket建立連線之前,設定HttpSession會話資訊,設定完成後再使用websocket建立連線才可行~

完整測試工程參考:https://github。com/netbuffer/spring-boot-websocket-demo