🔥《若依 LoginUser 全解析:企业权限的灵魂核心类》🔥

内容分享5小时前发布
0 1 0

前言:为什么企业权限必定要懂 LoginUser?

在所有的企业级后台系统中,“权限”始终是绕不开的核心。无论你在做的是 SaaS 平台、设备管理系统、能耗平台、ERP、智慧园区、数据中台、AI 平台……只要是后台系统,就离不开:

  • 用户是谁?
  • 他能做什么?
  • 他不能做什么?
  • 他有没有登录?登录多久?
  • Token 什么时候过期?
  • 怎么在每个接口识别当前登录者?

而在若依(RuoYi)框架中,解决这些问题的灵魂角色,就是今天的主角:


LoginUser —— 若依权限体系的“心脏”

只要你写若依项目,每一个接口里
SecurityUtils.getLoginUser() 背后,获取到的就是它!

只要你生成 Token,解析 Token,验证 Token,必定绕不过它!
只要你处理权限判断(Super Admin / Role / Menu / Button),必定要依赖它!

如果把若依比作一辆汽车:

  • LoginUser = 汽车的发动机
  • TokenService = 油箱
  • SecurityUtils = 点火开关
  • Interceptor = 发动机和轮子之间的传动轴

今天我们就把 LoginUser 拆得明清楚白,让你彻底吃透若依的权限体系!


第一章: LoginUser 是什么?它在哪?有什么用?

LoginUser 全路径如下:

com.ruoyi.framework.security.LoginUser

你可以把它理解成:

“登录用户的完整画像”

只要用户登录成功,这个 LoginUser 对象就会被存储到 Redis(或者 Sa-Token 的 Session),并在每次 Token 校验时重新装载回来。

它里面包含的信息超级丰富,例如:

✔ 用户基本信息
✔ 用户所属部门
✔ 用户的角色列表
✔ 菜单权限标识
✔ 按钮权限标识
✔ 登录时间、过期时间
✔ Token 字符串
✔ 浏览器 UA 等扩展数据

企业开发中所有与用户权限相关的逻辑,都从 LoginUser 出发!


第二章: LoginUser 的源码长什么样?逐行拆解讲清楚

下面是 LoginUser 的核心代码(不同版本略有差别,但本质一致):

public class LoginUser implements UserDetails {
    private static final long serialVersionUID = 1L;

    private Long userId;          
    private Long deptId;          
    private Long loginTime;       
    private Long expireTime;      
    private String token;         
    private String ipaddr;        
    private String loginLocation; 
    private String browser;       
    private String os;            
    private Set<String> permissions;    
    private SysUser user;                
}

目前我将逐项拆开讲,让你完全理解每个字段的意义、使用方式、真实业务价值。


1. userId —— 用户唯一身份 ID

全系统通用身份标识。
在任何操作日志、审计系统、业务数据关联中都依赖它。

典型使用:

  • 操作记录
  • 数据权限过滤
  • 接口权限校验

2. deptId —— 用户所在部门

用于多级组织架构与部门级权限隔离。

使用场景:

  • 只能查看本部门数据
  • 基于部门的审批流过滤
  • 部门维度统计报表

3. loginTime / expireTime —— 登录有效期控制

结合 JWT 机制,实现动态续期。
防止用户被踢下线或长期占用登录状态。


4. token —— 身份凭证

每次调用接口时,你在 Header 中传的:

Authorization: Bearer XXXXXXX

依赖的就是 LoginUser 存储的 token。


5. ipaddr, browser, os, loginLocation

用于安全审计、风控策略,例如:

✔ 异地登录提醒
✔ 可疑设备登录拦截
✔ 登录日志记录
✔ 统计访问来源


6. permissions —— 菜单 & 按钮权限全集

这是角色系统的核心!

例如:

system:user:list
system:user:add
system:monitor:job:edit

Vue 前端会根据这个数组动态控制:

  • 菜单显示/隐藏
  • 按钮禁用/隐藏
  • 路由是否可访问

几乎整个 RBAC 就依赖这个字段!


7. user —— SysUser 对象

把完整的业务侧用户信息装进去,让所有接口都能方便获取。

例如:

getLoginUser().getUser().getNickName()
getLoginUser().getUser().getAvatar()

第三章: LoginUser 是怎么被创建的?Token 怎么来的?

若依登录流程如下:

1. 前端提交登录参数
用户名 + 密码

2. LoginService 校验密码、查数据库

3. LoginService 创建 LoginUser 对象

4. TokenService 给 LoginUser 生成 Token

5. LoginUser + Token 存入 Redis

6. 返回 Token 给前端

7. 后续所有接口都带着 Token 来认证

☀️ 重点:LoginUser 是企业级权限体系的唯一载体!


第四章: 系统如何从 Token 中解析 LoginUser?

当你访问接口时,SecurityFilter 会进行:

1. 从 Header 提取 Token
2. 解密 Token 得到 userId
3. 去 Redis 查询 LoginUser
4. 放到 SecurityContextHolder

所以你在任意地方都可以这样取:

LoginUser loginUser = SecurityUtils.getLoginUser();

是不是超级丝滑?


第五章: LoginUser 在权限判断中的终极作用

菜单权限

Vue 根据 loginUser.permissions 动态渲染菜单

按钮权限

例如

v-hasPermi="['system:user:add']"

后端接口权限

@PreAuthorize("@ss.hasPermi('system:user:list')")

底层获取的也是 LoginUser → permissions

超级管理员判断

SecurityUtils.isAdmin()

第六章: 企业级开发中的典型使用案例(超级重大)

以下内容超级干货,尤其适合大型业务系统。


案例 1:操作日志记录

Long operatorId = SecurityUtils.getLoginUser().getUserId();
String operatorName = SecurityUtils.getLoginUser().getUser().getNickName();

用于记录“谁做了什么”。


案例 2:数据权限过滤

在 Mapper 层拼 SQL:

AND dept_id IN (SELECT dept_id FROM sys_dept WHERE find_in_set(dept_id, #{loginUser.deptId}))

案例 3:跨服务调用时传递用户身份

微服务场景下必备!

可以直接把 LoginUser 转换成 JSON 再传出去。


案例 4:构建审计中心

LoginUser 的 browser / os / ipaddr / loginLocation
可以直接作为风控参数输入规则引擎。


案例 5:动态权限刷新

当角色改动、菜单改动时,只需要:

重新生成 LoginUser → 刷新 Redis

系统权限立即生效!


第七章: 性能优化 & 架构扩展提议(企业级项目极其重大)


优化 1:LoginUser 中不要塞过多数据

大对象会导致 Redis 内存暴涨。
提议:不要加入与权限无关的大字段(如用户详情过长)。


优化 2:permissions 不要超过 10 万条

对大规模权限系统可以:
✔ 按角色缓存
✔ 按系统拆分权限
✔ 权限 Tree 结构扁平化


优化 3:Token 续期策略优化

若依内部有定时任务续期,提议调整:

✔ 移动端长登录
✔ 后台运营管理短登录


优化 4:适配 Sa-Token

若依新版支持 Sa-Token,LoginUser 可以直接作为 Session Object
让权限过程更优雅:

StpUtil.getSession().get("loginUser")

第八章:❓常见问题 Q&A(爆款文章必备)


❓ Q1:为什么 LoginUser 要序列化?

由于它要存 Redis,需要序列化、反序列化。


❓ Q2:为什么菜单权限和按钮权限都放在 permissions?

由于前端控制渲染,后端控制访问,两者都依赖同一套标识体系。


❓ Q3:登录后修改用户头像、昵称不生效?

由于 LoginUser 缓存未刷新。
解决:

重新写入 Redis 中的 LoginUser

❓ Q4:用户被禁用后登录仍可访问接口?

由于已有 Token 未失效。
解决:

踢出用户 session

第九章:✨ 写给架构师的进阶提议(超级关键)


提议 1:LoginUser 扩展租户字段

例如:

private Long tenantId;

可以实现多租户隔离(SaaS 必备)。


提议 2:扩展数据权限字段

例如:

private List<Long> deptScope;

可实现更复杂的数据权限矩阵。


提议 3:扩展登录设备信息

如:

  • 设备唯一 ID
  • App 版本号
  • 信任设备标签

用于风控中心建设。


第十章: 总结:LoginUser 是整个若依生态的权限核心引擎

你需要记住一句话:

只要项目里需要识别当前用户,LoginUser 就是唯一来源。

它承担了:
✔ 用户信息载体
✔ 权限载体
✔ Token 关联对象
✔ 登录状态维护对象
✔ 审计数据来源

可以说,真正了解 LoginUser 的人,才算真正掌握了若依的权限体系!

© 版权声明

相关文章

1 条评论

  • 头像
    龙川 读者

    收藏了,感谢分享

    无记录
    回复