ruoyi-vue中的用户数据权限分析及自定义

AgenticCoding·十二月创作之星挑战赛 10w+人浏览 405人参与

学习目的:掌握ruoyi-vue中等用户数据权限分析及自定义


目录

一、用户数据权限分析

1.1后端代码分析

二、自定义数据权限

测试:


一、用户数据权限分析

这是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账号可以看到所有的数据

### RuoYi-Vue-fast 和 RuoYi-Vue 的主要差异 RuoYi 是一款基于 Spring Boot 和 Vue.js 开发的企业级权限管理系统框架,而其衍生版本 RuoYi-VueRuoYi-Vue-fast 则分别针对不同的开发需求进行了优化设计。以下是两者的主要区别: #### 1. **项目定位** - RuoYi-Vue 是经典的前后端分离架构实现方案,适合需要全面功能支持的传统企业应用开发场景[^1]。 - RuoYi-Vue-fast 更加注重快速启动和轻量化部署,适用于希望减少初始配置时间的小型项目或原型开发环境[^2]。 #### 2. **技术栈与依赖管理** - RuoYi-Vue 使用了较为完整的前端工具链,包括 Element UI 组件库以及一些额外的功能插件来增强用户体验[^3]。 - 对比之下,RuoYi-Vue-fast 倾向于精简版的技术选型,在保留核心业务逻辑的同时移除了部分非必要组件和服务以降低复杂度[^4]。 #### 3. **初始化成本** - 配置方面,由于传统模式下的 RuoYi-Vue 提供更多自定义选项因此初期设置相对耗时较长;然而这也意味着它能够适应更广泛的实际生产需求[^5]。 - 反观 fast 版本则通过预设默认参数等方式极大简化了首次运行所需的准备工作量从而加快迭代速度[^6]。 #### 4. **性能表现** - 轻量化的结构使得 RuoYi-Vue-fast 在资源消耗上有一定优势特别是在低规格服务器环境中运行效率更高[^7]。 - 不过对于大规模数据处理或者高度定制化界面展示来说标准版可能仍然更具竞争力因为后者拥有更加丰富的扩展能力[^8]。 #### 5. **社区支持与文档完善程度** - 正规发行系列通常会获得更为及时频繁更新维护并配有详尽教程指导新用户入门学习过程[^9]。 - 尽管如此fast分支同样继承了许多基础特性但由于发布时间较短所以某些高级特性的讲解可能会稍显不足[^10]。 ```javascript // 示例代码片段:Vue 实现简单的增删改查操作 <template> <el-table :data="tableData"> <el-table-column prop="date" label="日期"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { date: '2023-01-01', name: '张三', address: '北京市' }, { date: '2023-01-02', name: '李四', address: '上海市' } ] }; } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值