企业认证与安全体系(四):企业登录认证流程全解析——JWT、Redis、Spring Security 如何协同工作?
上一篇我们讲了:
《企业认证与安全体系(三):一篇讲透 JWT 原理与企业级实践》
我们已经知道:
- JWT 是什么
- JWT 为什么无法篡改
- JWT 为什么无法主动失效
- Redis 为什么会出现在认证体系里
- 企业为什么采用双 Token 机制
但问题来了:
在真实企业项目中:
JWT Redis Spring Security Gateway这些东西到底是什么关系?
很多开发学完之后:
会一种感觉:
JWT会了 Redis也懂了 Spring Security也听过 但是不知道它们到底怎么串起来今天我们就从工程视角,
通过一次真实登录流程,
彻底讲透:
企业认证体系全景图
一、先看整体架构
我们先不看代码。
先建立全局认知。
一个典型企业项目:
Android / iOS / Web │ ▼ Gateway │ ▼ Spring Security │ ▼ JWT │ ▼ Redis │ ▼ Controller │ ▼ Service很多人第一次看 会觉得:
怎么这么多组件?实际上:它们职责完全不同。
二、每个组件负责什么
先记住一句话:
不同组件解决不同问题
JWT负责:
我是谁Redis负责:
我还能不能访问Spring Security负责:
认证框架Gateway负责:
统一入口简单理解:
| 组件 | 职责 |
|---|---|
| JWT | 身份认证 |
| Redis | 会话控制 |
| Spring Security | 认证框架 |
| Gateway | 流量入口 |
三、一次登录到底发生了什么
用户 输入:
账号 密码点击登录。
流程:
客户端 │ ▼ POST /login │ ▼ Spring Security │ ▼ 校验用户名密码 │ ▼ 生成JWT │ ▼ 生成RefreshToken │ ▼ Redis保存RefreshToken │ ▼ 返回客户端这里:
Spring Security负责:
账号密码认证JWT负责:
后续接口访问Redis负责:
保存会话四、登录成功后客户端拿到了什么
通常 服务端返回:
{ "accessToken":"xxxxx", "refreshToken":"yyyyy" }含义:
AccessToken:
访问接口RefreshToken:
刷新AccessToken有效期通常:
AccessToken 30分钟 RefreshToken 7天五、一次接口请求发生了什么
例如:
获取用户信息:
GET /user/info客户端:
携带:
Authorization: Bearer xxxxxx请求进入:
Gateway然后:
Spring Security Filter链然后:
JWT校验流程:
客户端 │ Bearer Token ▼ Gateway │ ▼ JwtFilter │ ▼ 解析JWT │ ▼ 验证签名 │ ▼ 检查是否过期如果失败:
直接:
401 Unauthorized如果成功:进入下一步。
六、SecurityContextHolder 是什么时候出现的
JWT验证成功后:
Spring Security会创建:
Authentication对象。
可以理解成:
当前登录用户例如:
userId = 1001 username = admin role = ADMIN然后:
放入:
SecurityContextHolder里面。
此时:
系统已经知道:
当前请求是谁了。
所以后续:
Controller:
getCurrentUserId()就能直接拿到:
1001七、Redis 在哪里发挥作用
很多人以为:
JWT验签成功:
就结束了。
实际上:
企业里往往还会:
查 Redis
例如:
JWT:
userId = 1001然后:
检查:
login:user:1001是否存在。
存在:
允许访问不存在:
401为什么?
因为:
JWT 无法主动失效
而 Redis 可以。
所以:
企业真实流程:
JWT认证 + Redis会话检查八、一次自动续签发生了什么
假设:
AccessToken:
30分钟到期。
请求接口:
401 Unauthorized客户端发现:
AccessToken失效自动调用:
POST /refresh携带:
RefreshToken服务端:
检查 Redis。
合法:
生成:
新AccessToken返回客户端。
客户端:
重新请求原接口。
整个过程:
用户无感知九、一次强制下线发生了什么
管理员:
点击:
踢下线服务端:
删除:
login:user:1001此时:
用户手机里的JWT:
其实还在。
但是:
下次请求:
JWT验签成功之后:
Redis检查失败。
直接:
401实现:
强制下线
十、为什么企业喜欢这种方案
因为:
JWT:
解决:
身份认证Redis:
解决:
会话管理Spring Security:
解决:
认证流程管理Gateway:
解决:
统一入口职责清晰。
扩展方便。
十一、真实企业认证链路全景图
到这里,
你应该已经能把整个认证体系串起来了。
用户登录 │ ▼ Spring Security认证账号密码 │ ▼ 生成JWT │ ▼ 生成RefreshToken │ ▼ Redis保存RefreshToken │ ▼ 返回客户端后续访问:
客户端 │ Bearer Token ▼ Gateway │ ▼ JwtFilter │ ▼ JWT验证 │ ▼ Redis检查 │ ▼ SecurityContextHolder │ ▼ Controller │ ▼ Service这就是:
企业认证体系最经典的架构
最终核心理解
很多开发学习认证体系时:
容易把:
JWT Redis Spring Security Gateway看成四个独立知识点。
实际上:
它们是:
一条完整链路
JWT负责:
身份认证Redis负责:
会话生命周期管理Spring Security负责:
认证框架Gateway负责:
统一鉴权入口它们共同组成:
企业级认证与授权体系
下篇预告
下一篇我们继续:
《企业认证与安全体系(五):Spring Security + JWT + Redis 企业级认证实战》
真正进入代码层面:
- SecurityConfig 如何配置
- JwtAuthenticationFilter 如何实现
- OncePerRequestFilter 为什么必须用
- 登录接口如何生成 JWT
- Redis 如何管理 RefreshToken
- 自动续签如何实现
- 强制下线如何实现
彻底实现一套:
