
学习目的:掌握ruoyi-vue中等用户数据权限分析及自定义
目录
一、用户数据权限分析
这是admin超级管理员看到的用户管理

这是ry普通用户看到的用户管理,可以看到两者区别是 普通用户只能看到属于他的部门用户,而admin可以看到所有部门的用户数据。

这是怎么做到的呢?
通过对用户进行自定义的数据权限控制进行管理


1.1后端代码分析
这是获取所有数据的list

这是他的service 可是看到写了一个注解@DataScope 还说明了部门表的别名为d 这个注释有什么用了,我们先往下看。

可以看到sql只有 一条 那么问题来了,ruoyi他是怎么根据不同的数据权限去进行传递的呢。答案就在这个${params.dataScope}里

在ruoyi-framework框架下找到了这个datascopeaspect

可以看到它的常量定义 跟我们前端看到的对于普通用户设置的数据权限是对应的。

可以看到它使用了@Before 这注释说明 当你使用@DataScope注解 dobefore方法会最先执行,

这个方法会先清空掉旧的datascope 防止注入

获取当前登录用户,如果是超级管理员直接跳过数据过滤。

List conditions = new ArrayList(); // 记录已经处理过哪种权限,避免重复
List scopeCustomIds = new ArrayList(); // 收集有“自定义权限”的 roleId(后面可能要 IN 查询)
// 第一步:先找出用户所有角色中,有“自定义部门权限”且包含当前菜单权限的 roleId

遍历当前用户所有角色,跳过已处理过的权限类型(防止重复拼接),跳过没有当前菜单操作权限的角色(比如有用户管理角色,但没“查看”权限)

1.全部数据权限 直接清空啥也不拼

2.自定义部门,多个角色都是自定义权限 → 用 IN 查询,避免重复 OR

3.本部门

4.本部门及子部门

5.仅本人

如果所有角色都没有当前菜单的权限 → 故意让查不出数据

真正核心的sql拼接逻辑
// 注意:这里默认只取第一个参数!(RuoYi 约定:查询条件对象永远是第一个参数)
Object params = joinPoint.getArgs()[0];
// 重点!重点!重点!这就是终极注入点!
// sqlString 当前是 " OR xxx OR yyy OR zzz"
// substring(4) 把开头的 " OR " 去掉 → 变成 "xxx OR yyy OR zzz"
// 再包上 " AND (" ... ")" → 变成 " AND (xxx OR yyy OR zzz)" baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")");

总结
一个用户有多个角色 → 遍历所有角色 → 按“权限范围从小到大”拼接 OR 条件 → 取最严格的组合 → 包成 AND (...) → 硬塞进第一个参数对象的 params.dataScope → MyBatis 自动 ${params.dataScope} 替换 → 完事。
二、自定义数据权限
使用代码生成工具生成简易的设备信息

要求如下:
不同的普通用户只能看到自己部门的设备,而超级管理员可以看到全部的设备.
创建实体类 必须继承baseEntity

添加注解

添加sql语句

添加一个财务部门的用户

105是测试部门,106是财务部门

给普通角色修改好菜单权限 这样才能看到设备信息页面

给普通分配本部门及以下数据权限 这样每个用户就根据自己的部门来查看数据

测试:
登录ry的账号 属于105的测试部门
登录wcx的账号 属于106的财务部门

admin账号可以看到所有的数据

4296

被折叠的 条评论
为什么被折叠?



