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

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

使用SpringBoot搭建实时通信服务
SpringBoot整合websocket获取http会话信息

在实际生产环境中,我们的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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容