欢迎光临散文网 会员登陆 & 注册

基于SpringBoot的websocket连接访问控制方案

2021-10-24 12:54 作者:向上生长之路  | 我要投稿

之前的文章中已经介绍过SpringBoot整合websocket的基本使用

在实际生产环境中,我们的websocket服务器一般儿都会设置一定的安全访问控制策略,不会允许客户端不经过认证就能同服务器进行通信服务,接下来给大家介绍下,通过在websocket建立握手阶段,验证客户端的相关凭证信息用以检测客户端身份的合法性,来实现服务器端的安全访问控制~

  • SpringBoot版本 2.4.5

工作原理

Spring为我们提供了HandshakeInterceptor握手拦截器



查看源码可以看到HandshakeInterceptor中提供了beforeHandshakeafterHandshake两个方法,它作用在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


基于SpringBoot的websocket连接访问控制方案的评论 (共 条)

分享到微博请遵守国家法律