数据权限
数据权限用于控制“用户能看到哪些业务数据”。它不同于功能权限:功能权限决定能否进入页面或点击按钮,数据权限决定进入页面后查询结果的范围。RuoYi Office 当前在角色维度配置数据范围,并结合部门树实现组织隔离。
本地实现位置
| 层 | 位置 |
|---|---|
| 角色页面 | ruoyi-office-vben/apps/web-antd/src/views/system/role |
| 数据权限弹窗 | views/system/role/modules/assign-data-permission-form.vue |
| 权限接口 | ruoyi-office-vben/apps/web-antd/src/api/system/permission |
| 后端入口 | yudao-module-system-server/.../permission/PermissionController.java |
| 数据权限框架 | ruoyi-office/yudao-framework/yudao-spring-boot-starter-biz-data-permission |
数据权限与功能权限的区别
| 维度 | 功能权限 | 数据权限 |
|---|---|---|
| 控制对象 | 菜单、按钮、接口 | 查询数据范围 |
| 配置位置 | 角色分配菜单 | 角色分配数据范围 |
| 常见标识 | system:user:create | dataScope、dataScopeDeptIds |
| 典型问题 | 看不到按钮、接口 403 | 列表数据少、只能看本部门 |
配置入口
进入“系统管理 -> 角色管理”,在角色行操作中选择“数据权限”。弹窗会加载部门树,并提交到:
text
POST /system/permission/assign-role-data-scope请求体来自 AssignRoleDataScopeReqVO:
| 字段 | 说明 |
|---|---|
roleId | 角色编号 |
dataScope | 数据范围类型 |
dataScopeDeptIds | 自定义数据范围下允许访问的部门编号列表 |
常见数据范围
实际选项以 SystemDataScopeEnum 和后端枚举为准,项目中常见语义如下:
| 范围 | 说明 | 适用场景 |
|---|---|---|
| 全部数据 | 不限制部门 | 超级管理员、集团级管理员 |
| 指定部门数据 | 只看勾选部门 | 区域负责人、共享服务中心 |
| 本部门数据 | 只看用户所在部门 | 部门主管 |
| 本部门及以下数据 | 看本部门与子部门 | 事业部负责人 |
| 仅本人数据 | 只看自己创建或归属的数据 | 普通员工、销售个人 |
前端交互细节
assign-data-permission-form.vue 支持三类辅助操作:
- 全选:一次勾选全部部门节点。
- 全部展开:展开完整部门树,便于跨层级选择。
- 父子联动:控制部门树勾选时父子节点是否联动。
当 dataScope 不是“指定部门数据”时,前端会把 dataScopeDeptIds 置空,避免保存无效部门列表。
后端生效链路
业务模块是否自动生效,取决于查询方法、Mapper 和数据权限注解是否接入框架。少数公共查询或个人中心查询会显式关闭数据权限,例如个人中心查询部门信息时使用 @DataPermission(enable = false)。
二开建议
- 新增业务表时明确归属字段:如果列表需要按部门或本人过滤,表结构和 DO 应能表达创建人、负责人、部门等归属关系。
- 不要用前端过滤替代后端数据权限:前端隐藏只是体验优化,安全边界必须在后端查询层。
- 公共字典、组织树谨慎过滤:基础数据过度过滤会导致下拉缺项,可参考个人中心按需关闭数据权限。
- 多角色用户取并集还是优先级要确认:排查数据过多/过少时,先查看用户拥有的所有角色及其数据范围。
排查清单
| 现象 | 排查方向 |
|---|---|
| 用户列表为空 | 用户角色的数据范围是否只包含空部门,当前账号是否有部门 |
| 勾选自定义部门未生效 | dataScope 是否为指定部门数据,dataScopeDeptIds 是否提交 |
| 普通员工看到全量数据 | 是否误分配了全部数据权限角色 |
| 个人中心能看到部门但业务列表看不到 | 个人中心可能关闭了数据权限,业务列表仍受限制 |
