很多人使用若依时,对登录流程的理解往往停留在表面:

用户输入账号密码 → 点击登录 → 返回 token → 之后请求带 token。

但如果深入源码你会发现,背后其实是Spring Security+JWTRedis三者配合完成的一整套认证体系。

理解这套机制非常重要,因为它几乎是所有若依项目安全体系的基础。

这篇文章我们就从源码角度,完整拆解:若依登录认证是如何工作的。

一、先看整体登录架构

若依的认证体系,本质上是三个组件的组合: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是怎么落地的

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐