java
2024-07-29
2024-07-29
尔曹身与名俱灭,不废江河万古流。——杜甫
今天做了这么一个需求:
在shenyu登录时候让之前的token失效
这里主要是在token里添加了一个唯一标识符与数据库里的值进行校验,每次登录生成新的唯一标识符存储到数据库中
PR链接如下:
https://github.com/apache/shenyu/pull/5600
描述如下:
概述:
此拉取请求解决了新的登录会话应使同一用户的所有先前登录会话失效的业务需求。这是通过引入 client_id
字段来实现的,该字段唯一标识每个登录会话。 client_id
包含在 JWT 令牌中,并针对每个请求进行验证,以确保只有最新的会话保持活动状态。
引入的变化:
-
后端增强:
- 向用户模型添加了一个
client_id
字段来跟踪当前会话的客户端 ID。 - 更新了身份验证过程,以在每次登录时生成新的
client_id
。 - 修改了
JwtUtils
以将client_id
包含在生成的 JWT 令牌中并在令牌验证期间提取它。
- 向用户模型添加了一个
-
ShiroRealm 修改:
- 在
ShiroRealm
中添加了逻辑,以从 JWT 令牌中提取client_id
。 - 实施了一项检查,将提取的
client_id
与存储在用户会话数据中的内容进行比较。 - 如果令牌中的
client_id
与存储的client_id
不匹配,则会抛出AuthenticationException
,从而使令牌无效。
- 在
详细代码变更:
1、用户模型:
- 引入了一个新字段
clientId
来存储每个用户会话的活动客户端 ID。
2.JwtUtils修改:
- 修改了
generateToken
方法以将client_id
包含在 JWT 负载中。 - 添加了从 JWT 令牌中提取
client_id
的方法。
影响:
此更新可确保新的登录使所有先前的令牌失效,从而通过防止多个活动会话使用相同的凭据来增强安全性。这种机制对于会话完整性和安全性至关重要的应用程序至关重要。
测试:
- 添加了单元测试来验证 JWT 令牌中
client_id
的生成、包含和验证。 - 集成测试确保旧令牌在新登录时失效,并且有效令牌得到正确身份验证。
文档:
相关文档部分已更新,以描述新的 client_id
字段及其在会话验证中的作用。
结论:
该 PR 通过确保只有最新的登录会话有效,显着增强了 Apache ShenYu 的安全框架。它提供了一种强大的机制,可以通过令牌重用来防止未经授权的访问,并与会话管理的最佳实践保持一致。