news 2026/11/4 7:28:04

源码解析:RuoYi-Vue 登录功能的后端调用全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
源码解析:RuoYi-Vue 登录功能的后端调用全流程

前言

若依的登录体系用一句话概括就是「一次签发,每次校验」:

  • 登录时:认证通过后生成令牌,把登录用户写入 Redis;

  • 登录后:每个请求由过滤器从 Redis 取出登录用户完成鉴权。

它没有使用自解释型 JWT,而是「UUID 令牌 + Redis 存储」——服务端不解析令牌内容,Redis 中的login_tokens:{token}才是会话真相。本文按真实代码链路走一遍完整流程。

一、涉及的核心类

类 / 组件

职责

SysLoginController

登录入口POST /login,只做参数转发

SysLoginService

登录主流程编排:验证码 → 前置校验 → 调 Spring Security 认证 → 记录日志

UserDetailsServiceImpl

Spring Security 回调,按用户名查库并组装 LoginUser

SysPasswordService

密码错误次数计数(错 10 次锁 10 分钟)与 BCrypt 比对

TokenService

生成 UUID 令牌,LoginUser 写入 Redis(30 分钟),续期与删除

JwtAuthenticationTokenFilter

每个请求的鉴权过滤器:取 token → 查 Redis → 写入 SecurityContext

RedisCache

Redis 操作封装,验证码与登录令牌的存取都经过它

二、阶段 0:验证码(可配置关闭)

登录之前,前端先请求GET /captchaImage:后端生成一道算术题,把答案以captcha_codes:{uuid}为键写入 Redis(有效期 2 分钟),将图片 Base64 与 uuid 返回前端。

参数sys.account.captchaEnabled=false时跳过整个验证码校验(本地测试常用)。

三、阶段 1:登录与令牌签发

3.1 入口:Controller 只做转发

@PostMapping("/login") public AjaxResult login(@RequestBody LoginBody loginBody) { AjaxResult ajax = AjaxResult.success(); // 生成令牌 String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), loginBody.getUuid()); ajax.put(Constants.TOKEN, token); return ajax; }

3.2 验证码校验

SysLoginService.validateCaptcha:按 uuid 从 Redis 取答案比对——取不到报「验证码已失效」,不匹配报「验证码错误」,且无论对错用后即删。

3.3 前置校验

IP 黑名单校验、用户名密码长度边界检查。

3.4 委托 Spring Security 认证

authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(username, password));

DaoAuthenticationProvider回调UserDetailsServiceImpl.loadUserByUsername:查询sys_user(含部门、角色),依次校验用户不存在 / 已删除 / 已停用 / IP 锁定等状态。

3.5 密码校验

SysPasswordService:错误次数写入 Redis(pwd_err_cnt:{username}),连续错 10 次锁定 10 分钟;密码使用 BCrypt 不可逆比对。

3.6 认证成功收尾

异步记录登录日志sys_logininfor,更新用户登录 IP 与时间,清空密码错误计数。

3.7 签发令牌

TokenService.createToken(loginUser):生成 UUID 作为 token,将 LoginUser(用户 + 角色 + 权限)以login_tokens:{token}为键写入 Redis,有效期 30 分钟。最终返回:

{ "code": 200, "token": "xxxxxxxx-xxxx-xxxx" }

四、阶段 2:登录后的每次请求鉴权

  1. JwtAuthenticationTokenFilter(OncePerRequestFilter)拦截请求,从请求头Authorization: Bearer {token}取出令牌;

  2. TokenService.getLoginUser按login_tokens:{token}查 Redis,查不到则最终返回401 认证失败;

  3. 剩余有效期不足 20 分钟时自动refreshToken续期;

  4. 将 LoginUser 写入SecurityContextHolder,之后 Controller 上的@PreAuthorize("@ss.hasPermi('xxx')")据此做权限判断。

五、阶段 3:getInfo 与退出

  • GET /getInfo:从 SecurityContext 取 LoginUser,返回 user、roles、permissions 三组数据;权限集合有变化时同步刷新 Redis 缓存,前端据此渲染菜单与按钮。

  • GET /getRouters:按角色查询动态路由树,生成左侧菜单。

  • POST /logout:删除 Redis 中的login_tokens:{token}并记录退出日志,令牌即刻失效——会话状态在 Redis 而非客户端,所以服务端可以主动踢人。

六、全流程泳道图

登录 → 首页数据加载 → 退出 的完整调用链路如下:

七、设计总结

  1. 为什么用 UUID + Redis 而不是纯 JWT:牺牲一次 Redis 查询,换来服务端主动失效、在线用户管理、单点登录控制三大能力;

  2. 两条时间线是两套代码:登录瞬间走认证链(入口SysLoginController),登录之后走过滤器鉴权(入口JwtAuthenticationTokenFilter);

  3. 四层安全防线各司其职:验证码防机器人 → 错误次数锁定防爆破 → BCrypt 防拖库 → @PreAuthorize 防越权;

  4. 两个高频报错的区分:「401 认证失败」发生在过滤器阶段(token 缺失/过期);「验证码已失效」发生在登录阶段(Redis 键过期)——排查时先定位阶段。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 7:27:57

概率论数字特征:从期望到协方差的应用解析

1. 数字特征的本质与学习价值随机变量的概率分布虽然完整描述了统计规律,但在实际应用中我们往往需要更简洁的量化指标。这就好比要描述一个人的体型特征,与其每次都展示全身3D扫描数据,不如直接给出身高、体重、体脂率等关键指标。数字特征正…

作者头像 李华
网站建设 2026/11/4 7:27:57

鸿蒙CoreSpeechKit语音识别开发实战与优化

1. 项目背景与核心价值在移动应用开发领域,语音交互正成为提升用户体验的关键技术。鸿蒙系统的CoreSpeechKit作为原生语音识别框架,为开发者提供了高效稳定的语音识别能力。不同于第三方SDK需要额外集成和授权,CoreSpeechKit直接内置在鸿蒙系…

作者头像 李华
网站建设 2026/11/4 7:27:36

私域直播技术实现与运营全解析

1. 私域直播功能的市场背景与价值最近两年,私域流量运营已经成为企业数字营销的核心战场。相比公域平台的高昂获客成本和有限触达,私域流量以其高转化、低成本、强粘性的特点,正在重构企业的用户运营体系。而直播作为当下最直接的互动形式&am…

作者头像 李华
网站建设 2026/11/4 7:27:30

R与Python混编:红酒评分的相关分析、回归与KNN分类

简介:面向数据分析课程大作业与统计建模入门练习,这份资料以红酒数据集为例,完整走通从数据清洗、相关性分析到回归与分类的建模流程,适合正在完成课程作业、需要一份可对照报告范例的高校学生与数据分析初学者参考。压缩包共 1 个…

作者头像 李华
网站建设 2026/11/4 7:26:57

古代玻璃文物成分分析建模复现:风化系数、PCA与灰色关联度

简介:面向参加全国大学生数学建模竞赛、希望系统复盘C题解法的学生与指导教师,这份资料围绕古代玻璃文物的成分分析与鉴别展开,覆盖风化效应、类型判别、未风化成分预测及化学成分关联性分析等核心问题。包内仅有1个PDF文件,压缩包…

作者头像 李华
网站建设 2026/11/4 7:26:45

SAP S/4HANA采购主数据实战:MM01采购视图E状态与BP配置全解析

简介:本资源是SAP S4 HANA采购模块(S4520)官方中文版系统化教程,专为应用顾问、项目经理及企业最终用户设计,聚焦供应链采购全链路实操能力提升。内容覆盖采购主数据维护(物料主记录视图分工、E状态控制&am…

作者头像 李华