上一篇我们讲了:
《企业认证与安全体系(三):一篇讲透 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
- 自动续签如何实现
- 强制下线如何实现
彻底实现一套: