基于SpringBoot的websocket連接訪問(wèn)控制方案
之前的文章中已經(jīng)介紹過(guò)SpringBoot整合websocket的基本使用


在實(shí)際生產(chǎn)環(huán)境中,我們的websocket服務(wù)器一般兒都會(huì)設(shè)置一定的安全訪問(wèn)控制策略,不會(huì)允許客戶端不經(jīng)過(guò)認(rèn)證就能同服務(wù)器進(jìn)行通信服務(wù),接下來(lái)給大家介紹下,通過(guò)在websocket建立握手階段,驗(yàn)證客戶端的相關(guān)憑證信息用以檢測(cè)客戶端身份的合法性,來(lái)實(shí)現(xiàn)服務(wù)器端的安全訪問(wèn)控制~
SpringBoot版本 2.4.5
工作原理
Spring為我們提供了HandshakeInterceptor握手?jǐn)r截器

查看源碼可以看到HandshakeInterceptor中提供了beforeHandshake與afterHandshake兩個(gè)方法,它作用在websocket建立連接握手前后階段,通過(guò)在beforeHandshake方法中返回的布爾值,能決定是否允許建立websocket連接,基于此,我們就能實(shí)現(xiàn)服務(wù)器的安全訪問(wèn)控制了
使用方式
修改registerWebSocketHandlers配置,增加HandshakeInterceptor攔截器實(shí)現(xiàn)類,來(lái)實(shí)現(xiàn)自定義的攔截策略

詳細(xì)代碼參考:https://github.com/netbuffer/spring-boot-websocket-demo/blob/master/src/main/java/cn/netbuffer/springboot/websocket/demo/interceptor/RbacHandshakeInterceptor.java
攔截方案一 基于cookie的攔截策略
編寫(xiě)基于cookie的攔截方法,從cookie中解析出訪問(wèn)憑證信息token值,實(shí)際的token值應(yīng)該基于用戶輸入的相關(guān)訪問(wèn)口令來(lái)簽發(fā)生成的,要結(jié)合所用的shiro、spring security、sa-token等安全認(rèn)證框架來(lái)綜合考慮~,token值是經(jīng)過(guò)安全算法生成的,不能被偽造,可以使用jwt(json web token)來(lái)承載

編寫(xiě)前端測(cè)試代碼同服務(wù)器進(jìn)行通信
詳細(xì)代碼參考:https://github.com/netbuffer/UItest/blob/master/websocket/index.html
第一次訪問(wèn)沒(méi)有攜帶cookie中的token值,結(jié)果會(huì)被服務(wù)器拒絕連接

通過(guò)在開(kāi)發(fā)者工具中注入cookie,設(shè)置token信息

再次訪問(wèn)前端測(cè)試頁(yè)面,觀察服務(wù)器日志輸出,可以看到從cookie中解析出了token值,我們就可以根據(jù)token信息來(lái)驗(yàn)證訪問(wèn)合法性了

攔截方案二 基于querystring的攔截策略
通過(guò)在websocket連接地址中設(shè)置querystring參數(shù),來(lái)驗(yàn)證token值

前端代碼先不帶querystring建立連接訪問(wèn)測(cè)試

觀察服務(wù)器日志,沒(méi)有從querystring中解析出token值,此時(shí)會(huì)拒絕連接

再次修改前端代碼設(shè)置querystring值,訪問(wèn)服務(wù)器測(cè)試,觀察服務(wù)器端日志中已經(jīng)解析到了token值,據(jù)此可以驗(yàn)證訪問(wèn)合法性了

攔截方案三 基于HttpSession的攔截策略
通過(guò)檢測(cè)HttpSession中用戶的登錄態(tài),以及其他相關(guān)的web會(huì)話信息,來(lái)驗(yàn)證合法性;這種方式不適用于前后端分離的項(xiàng)目,受限于有HttpSession會(huì)話才能完成校驗(yàn)

這種方式下,需要在websocket建立連接之前,設(shè)置HttpSession會(huì)話信息,設(shè)置完成后再使用websocket建立連接才可行~

完整測(cè)試工程參考:https://github.com/netbuffer/spring-boot-websocket-demo