若依登录认证源码深度解析:Spring Security + JWT是怎么工作的
很多人使用若依时,对登录流程的理解往往停留在表面:
用户输入账号密码 → 点击登录 → 返回 token → 之后请求带 token。
但如果深入源码你会发现,背后其实是Spring Security+JWT+ Redis三者配合完成的一整套认证体系。
理解这套机制非常重要,因为它几乎是所有若依项目安全体系的基础。
这篇文章我们就从源码角度,完整拆解:若依登录认证是如何工作的。
一、先看整体登录架构
若依的认证体系,本质上是三个组件的组合:Spring Security + JWT + Redis
职责分别是:
Spring Security:认证与权限框架
JWT:无状态 Token 认证
Redis:缓存用户登录信息
完整流程可以简化为:
用户登录
↓
Spring Security 认证
↓
生成 JWT Token
↓
Token 返回前端
↓
前端请求携带 Token
↓
TokenFilter 校验 Token
↓
从 Redis 获取用户信息
↓
放入 SecurityContext
只要理解这条链路,若依登录体系就基本掌握了。
二、登录入口:LoginController
登录接口在:LoginController
核心方法:
@PostMapping("/login")
publicAjaxResultlogin(@RequestBodyLoginBody loginBody)
主要逻辑其实很简单:调用登录服务,返回 token
代码结构类似这样:
Stringtoken = loginService.login(username, password);
returnAjaxResult.success(token);
真正的认证逻辑不在 Controller,而是在:SysLoginService
三、认证核心:AuthenticationManager
若依登录最关键的一步是:authenticationManager.authenticate()
代码大致是:
Authenticationauthentication=authenticationManager.authenticate(
newUsernamePasswordAuthenticationToken(username, password)
);
这行代码实际上会触发Spring Security 的认证流程。
流程大致如下:
AuthenticationManager
↓
AuthenticationProvider
↓
UserDetailsService
↓
校验用户信息
若依默认实现的是:UserDetailsServiceImpl
四、用户信息加载:UserDetailsServiceImpl
UserDetailsService 是 Spring Security 的核心接口。
若依实现类是:UserDetailsServiceImpl
关键方法:loadUserByUsername()
主要做几件事情:
1 查询用户信息
2 查询用户角色
3 查询用户权限
伪代码逻辑:
SysUseruser=userService.selectUserByUserName(username);
Setpermissions=permissionService.getMenuPermission(user);
returnnewLoginUser(user, permissions);
这里返回的是:LoginUser
这是若依封装的用户对象。
五、LoginUser:用户安全信息载体
LoginUser 是若依登录体系的核心对象之一。
里面包含:
SysUser user;
Set permissions;
Collection authorities;
简单理解:用户信息+权限信息+Spring Security 权限对象。当认证成功后,Spring Security 会把这个对象存入:SecurityContext,也就是:SecurityContextHolder
六、生成 Token:JwtTokenService
认证成功之后,若依会生成一个 JWT Token。
核心类:JwtTokenService
关键方法:createToken(LoginUser loginUser)
主要逻辑:
1 生成 JWT
2 保存用户信息到 Redis
伪代码:
Stringtoken =JwtUtils.createToken(userId);
redisCache.setCacheObject("login:"+ token, loginUser);
最终返回给前端:
{
"token":"xxxxx"
}
七、JWT Token 的作用
JWT 本质是一个身份凭证。
前端之后的请求都会带上:Authorization: Bearer token
例如:
GET/system/user/list
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
服务器就可以识别用户身份。
八、请求阶段:TokenFilter
用户登录之后,每个请求都会经过:JwtAuthenticationTokenFilter
它继承:OncePerRequestFilter
执行流程:
HTTP请求
↓
TokenFilter
↓
解析 JWT
↓
从 Redis 获取用户信息
↓
放入 SecurityContext
核心代码逻辑:
Stringtoken=getToken(request);
LoginUserloginUser=redisCache.getCacheObject("login:"+ token);
SecurityContextHolder.getContext().setAuthentication(authentication);
这样后续的接口就可以获取用户信息。
九、接口权限校验
当接口使用:@PreAuthorize("@ss.hasPermi('system:user:list')"),Spring Security 会自动进行权限校验。
流程:
请求进入
↓
Spring Security
↓
获取当前 LoginUser
↓
检查权限集合
↓
是否包含指定权限
如果没有权限,服务器会返回:403 Forbidden
十、为什么还要用 Redis?
很多人会问:既然 JWT 是无状态的,为什么若依还要 Redis?
原因有两个。
第一:存储用户登录信息,token → LoginUser,避免每次查询数据库。
第二:支持强制下线,如果只用 JWT:token 失效前无法注销,但有 Redis:删除 redis key,用户就会立刻失效。
十一、若依登录体系完整流程
把整个流程串起来就是:
用户登录
↓
LoginController
↓
AuthenticationManager
↓
UserDetailsServiceImpl
↓
加载用户权限
↓
生成 JWT Token
↓
保存 LoginUser 到 Redis
↓
返回 Token
之后每次请求:
请求携带 Token
↓
JwtAuthenticationTokenFilter
↓
解析 Token
↓
Redis 获取 LoginUser
↓
放入 SecurityContext
↓
接口权限校验
十二、若依认证体系的优点
总结一下若依这套设计。
第一:安全:Spring Security 提供完整安全体系。
第二:性能好:用户信息缓存到 Redis。
第三:支持分布式,JWT 无状态认证。
第四:可扩展:可以增加:单点登录、多端登录、强制下线
结语
很多人使用若依时,只看到一个简单的登录接口。
但在它背后,其实是一整套完整的认证体系:Spring Security + JWT + Redis
理解这套机制之后,你不仅能更好地使用若依,还能在自己的项目里设计出更加安全、可扩展的登录系统。
如果你对若依源码感兴趣,后面我还会继续拆解几个非常有意思的模块,例如:
AI 时代的源码深度解析:很多人会用若依(RuoYi)代码生成器,但很少有人真正懂它
AI 时代的源码深度解析:若依(RuoYi)权限体系源码深度解析:RBAC是怎么落地的
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)