SpringBoot实战:5分钟搞定Sa-Token集成WebSocket身份认证(附完整代码)

使用 Sa-Token 解决 WebSocket 握手身份认证 在 WebSocket 中集成 Sa-Token 身份认证,保证连接的安全性…… 阅读详情

SpringBoot实战:5分钟搞定Sa-Token集成WebSocket身份认证(附完整代码)

最近在做一个实时协作编辑的项目,后台需要向多个客户端推送文档的实时变更。一开始直接用原生WebSocket,连接倒是很快建起来了,但马上就遇到了一个头疼的问题:我怎么知道连上来的是谁?总不能随便一个匿名用户都能连上来接收敏感数据吧。WebSocket协议本身对身份认证这块几乎是空白的,握手阶段就那么几秒钟,传统的Session、Cookie机制在这里都不太好使。

折腾了一圈,试过在连接参数里传用户ID,也试过建立连接后再发个认证消息,总觉得不够优雅,安全上也有漏洞。直到把Sa-Token这个权限框架引入进来,才发现原来WebSocket的身份认证可以做得这么简洁。今天我就把自己踩坑后总结出来的最佳实践分享给你,核心目标就是让你在5分钟内,给SpringBoot项目中的WebSocket加上一套可靠的身份认证机制。

无论你是要做IM聊天、订单状态推送、还是实时数据大屏,这套方案都能直接复用。我会提供两种主流的集成方式:基于javax.websocket的原生方案和Spring封装的WebSocketHandler方案,并附上完整的、可运行的代码。咱们不搞理论堆砌,直接上手实操。

1. 为什么WebSocket需要独立的身份认证?

你可能已经习惯了在HTTP请求里用@PreAuthorize注解或者拦截器来做权限控制,但WebSocket是另一套玩法。它的连接建立过程(握手)虽然基于HTTP,但一旦握手成功,就升级成了全双工的TCP长连接,后续的通信不再走HTTP的那套请求-响应模型。这意味着,那些依赖HTTP Header、Cookie的认证方案,在WebSocket通道里可能就失效了或者变得很别扭。

更关键的是安全风险。想象一下,如果你的实时股票报价WebSocket服务没有认证,攻击者可以轻易建立连接,耗尽服务器资源;或者,一个普通用户连接上了只应向管理员推送的报警通道。因此,在握手阶段完成身份核验,是保障WebSocket服务安全的第一道,也是最重要的一道防线。

Sa-Token在这里扮演的角色,就是一个统一的会话管理中心。它帮我们解决了两个核心问题:

  1. 令牌(Token)的传递与验证:如何在WebSocket握手请求中携带并验证代表用户身份的令牌。
  2. 会话(Session)的绑定:如何将成功的WebSocket连接与后台的用户会话对象关联起来,以便后续的定向消息推送。

下面的表格对比了WebSocket认证的几种常见思路,你可以看看为什么Sa-Token的方案更优:

认证方式 实现复杂度 安全性 与现有系统集成度 推荐场景
连接参数传ID 极低 极低 低 内部测试、无需安全要求的场景
连接后首次消息认证 中 中 中 客户端可控性强、允许短暂未认证连接的场景
自定义握手协议 高 高 中 对协议有定制化需求的项目
Sa-Token令牌认证 低 高 高 绝大多数SpringBoot项目,尤其是已有Sa-Token登录体系的

提示:如果你的项目已经用Sa-Token管理了HTTP登录,那么为WebSocket增加认证几乎是零成本的,因为用户会话是共享的。

2. 项目初始化与依赖配置

我们先从一个干净的SpringBoot项目开始。这里假设你使用Maven进行构建。打开你的pom.xml文件,确保引入了以下三个核心依赖:

<dependencies>
    <!-- SpringBoot Web基础 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- SpringBoot WebSocket支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>

    <!-- Sa-Token 权限认证框架 -->
    <dependency>
        <groupId>cn.dev33</groupId>
        <artifactId>sa-token-spring-boot-starter</artifactId>
        <version>1.34.0</version> <!-- 请使用最新稳定版 -->
    </dependency>
</dependencies>

版本注意:Sa-Token的版本更新较快,建议通过Maven中央仓库查询最新版本。1.34.0版本在WebSocket集成方面做了不少优化。

接下来,我们需要一个简单的用户登录接口,用于在前端获取连接WebSocket所必需的Token。这个控制器同时服务于你的HTTP API和WebSocket认证。


        
在 WebSocket 连接建立之前进行身份验证 另外,根据“CWE-1385: WebSockets 中缺少来源验证”的弱点描述,在 WebSocket 握手期间验证“Origin”标头来保护类似跨域资源共享(CORS)的访问限制,也有助于增强安全性。同时,要确保 token、签名或其他用于身份验证的信息具有足够的复杂性和保密性,并在服务器端进行严格的验证逻辑,以防止身份验证被绕过或攻击。这些方法可以根据具体的应用场景和需求进行选择和实施。上述示例中的代码是一种常见的实现方式,你可能需要根据你的实际项目环境进行相应的调整。 阅读详情

相关推荐

保证 WebSocket 连接之前的身份验证过程的安全性

以下是一些保证在 WebSocket 连接之前的身份验证过程安全性的方法:ws://wss://wss://wshttpswsscryptowss://

Chihirozy的博客 1279

SpringBoot为WebSocket添加安全认证与授权功能

19年初,Spring 推出了 Spring Websocket 技术,这是一种基于WebSocket协议的消息通信框架,用于快速开发WebSocket API。在实际应用中,WebSocket 可以很好的降低服务器负载、节省带宽资源并提供实时数据传输。但是,由于WebSocket本身没有身份验证机制、没有授权机制,使得其很容易受到攻击或泄漏敏感信息,因此需要引入安全认证与授权机制来保障WebSocket应用的完整性。Spring Boot为WebSocket添加安全认证与授权功能提供了开箱即用的解决方案。

AI天才研究院 3880

WebSocket用户验证

在WebSocket中,如何携带用户的验证信息。

Waiter软件工作室 3237

spring boot+vue+websocket带token身份认证推送消息实现

vue前端后端分离spring boot 2.0集成websocket,带身份认证实现消息推送功能

解决Linux下Questasim中代码字体非常小

Questasim的source窗口里代码字体非常小 你是不是也遇到这样的问题,在使用Vmware时,Questasim的代码字体非常小,小到完全看不见,连断点都没办法标记。 下面我给出我摸索好久的解决办法,分享给大家。 1.首先,版本是Questasim 10.7c,在Vmware16中打开,情况如下: 不多逼逼,直接上图开搞: 给textFontV2设置值:monospace 12 normal roman 这里一定要注意啦,点完apply之后,不要点ok,直接关闭窗口。 ...

SummerXRT的博客 7801

如何使用安路TD与Modelsim进行联合仿真?

1)安装安路FPGA开发软件;(本次实验使用版本:TD_5.6.3_Release)2)安装Modelsim仿真软件;(本次实验使用版本:Modelsim SE-64 10.1c)3)FPGA开发板;(本次实验使用型号:EG4X20BG256)4)LED点灯例程;

qq_17313923的博客 3206

会员管理小程序实战开发04-用户登录及注册

上一节我们介绍了用户信息数据源的创建及网格布局的使用,本节的话我们讲解用户的登录及注册功能任何开发。 在我们前述章节里介绍的,不论是管理员表还是用户表,都涉及到一个问题就是openid,那这个openid如何获取呢?如果我直接把代码贴给你,就缺失了一个思考的过程。既然这个是微信提出的概念,那么必然就会有官方文档作为对应。程序开发的基本功就是要会看官方文档,很多初学的开发同学可能会对官方文档颇有诟病,觉得不够基础。怎么说呢,当你进入到开发岗之后,自学能力是必要的,还是要试着可以看懂官方文档才好。 登录接口解读

低代码布道师的博客 1555

R语言生存分析之竞争风险模型

R语言生存分析之竞争风险模型 竞争风险模型(Competing Risk Model)是一种处理多种潜在结局生存数据的分析方法,早在1999年Fine和Gray就提出了部分分布的半参数比例风险模型,通常使用的终点指标是累积发生率函数(cumulative incidence function,CIF)。 研究中结局事件可能有多个,某些结局将阻止感兴趣事件的出现或影响其发生的概率,各结局事件形成“竞争”关系,互为竞争风险事件。 竞争风险模型( Competing Risk Model ) : 指

data+scenario+science+insight 5232

stable diffusioncontrolNet 预处理器/模型的下载及安装使用教程

首先说明,controlNet 的模型 不同于stable diffusion 模型,这一点一定要区分清楚。下面提供多个ControlNet 预处理器+ 专用模型的百度网盘下载链接,都是由群友整理贡献,但各自包含的版本不同,大家可自行选择。推荐下载紫色链接内的模型,fp16版文件更小,稍微新一些的controlnet插件还添加了对control-lora的支持(注意,要求controlnet插件的版本比12月16号新(1.1.423以上)才能正常识别),推荐下载;

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3371

YOLOv11改进 | 损失函数改进篇 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余种损失函数

这篇文章介绍了YOLOv11的重大改进,特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体,如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU,还融合了“Focus”思想,创造了一系列新的损失函数。这些组合形式的损失函数超过了二十余种,每种都针对特定的目标检测挑战进行优化。文章会详细探讨这些损失函数如何提高YOLOv11在各种检测任务中的性能,包括提升精度、加快收敛速度和增强模型对复杂场景的适应性。

Snu77的博客 6163

RK3588 平台imx334 驱动调试记录

rk3588调试imx334

xiaoning132的专栏 1780

神经形态芯片:IBM TrueNorth技术详解以及应用案例

2018年的一项演示中,机器人使用TrueNorth处理了复杂的路径规划,功耗仅为传统系统的1/10。它通过模仿人脑的结构,解决了传统芯片在功耗和并行性上的痛点,并在图像识别、物联网和机器人等领域展现了强大潜力。:不同于传统芯片的时钟驱动,TrueNorth是事件驱动的。例如,工厂中的振动传感器使用TrueNorth检测设备故障的早期迹象,实现了更高效的维护策略,避免了停机时间。:在医疗领域,TrueNorth可以用于可穿戴设备,比如一个智能助听器,它能过滤噪音并增强特定声音,功耗低到可以用纽扣电池供电。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2463

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 嵌入式开发必看:非隔离电源设备调试的5大安全隐患及解决方案
下一篇: vLLM多机多卡部署全指南:从环境配置到性能调优的完整流程
编程勇者
博客等级 码龄10年 41粉丝 1575原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值