之前的文章中已经介绍过SpringBoot整合websocket的基本使用
在实际生产环境中,我们的websocket服务器一般儿都会设置一定的安全访问控制策略,不会允许客户端不经过认证就能同服务器进行通信服务,接下来给大家介绍下,通过在websocket建立握手阶段,验证客户端的相关凭证信息用以检测客户端身份的合法性,来实现服务器端的安全访问控制~
- SpringBoot版本 2.4.5
工作原理
Spring为我们提供了HandshakeInterceptor握手拦截器
查看源码可以看到HandshakeInterceptor中提供了beforeHandshake与afterHandshake两个方法,它作用在websocket建立连接握手前后阶段,通过在beforeHandshake方法中返回的布尔值,能决定是否允许建立websocket连接,基于此,我们就能实现服务器的安全访问控制了
使用方式
修改registerWebSocketHandlers配置,增加HandshakeInterceptor拦截器实现类,来实现自定义的拦截策略
详细代码参考: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)来承载
编写前端测试代码同服务器进行通信
详细代码参考:https://github.com/netbuffer/UItest/blob/master/websocket/index.html
第一次访问没有携带cookie中的token值,结果会被服务器拒绝连接
通过在开发者工具中注入cookie,设置token信息
再次访问前端测试页面,观察服务器日志输出,可以看到从cookie中解析出了token值,我们就可以根据token信息来验证访问合法性了
拦截方案二 基于querystring的拦截策略
通过在websocket连接地址中设置querystring参数,来验证token值
前端代码先不带querystring建立连接访问测试
观察服务器日志,没有从querystring中解析出token值,此时会拒绝连接
再次修改前端代码设置querystring值,访问服务器测试,观察服务器端日志中已经解析到了token值,据此可以验证访问合法性了
拦截方案三 基于HttpSession的拦截策略
通过检测HttpSession中用户的登录态,以及其他相关的web会话信息,来验证合法性;这种方式不适用于前后端分离的项目,受限于有HttpSession会话才能完成校验
这种方式下,需要在websocket建立连接之前,设置HttpSession会话信息,设置完成后再使用websocket建立连接才可行~
完整测试工程参考:https://github.com/netbuffer/spring-boot-websocket-demo