数据权限规则
Forge 通过 DataScopeInterceptor 做行级过滤。它和 @SaCheckPermission 不是一回事。
数据权限 vs 功能权限
| 维度 | 功能权限 | 数据权限 |
|---|---|---|
| 入口 | @SaCheckPermission | DataScopeInterceptor + sys_data_scope_config |
| 粒度 | 接口能不能进 | 能看见哪些行 |
| 作用层 | Controller | Mapper SQL 改写 |
拦截器按 Mapper 接口全限定名 + 方法名(mapperMethod)精确匹配配置。没有配置就按 forge.datascope.unconfiguredPolicy 处理,默认告警后放行。
角色 data_scope 取值
sys_role.data_scope 对应字典 sys_role_data_scope(种子 V1.0.13)。读取时走 DataScopeType.getByRoleDataScope:
| 角色字段值 | 含义 |
|---|---|
1 | 全部数据 |
2 | 本租户数据 |
3 | 本组织数据 |
4 | 本组织及子组织 |
5 | 个人数据;若 sys_role_data_scope 表里挂了组织,按自定义组织解释 |
7 | 本行政区划 |
没有「本部门 / 本部门及以下」这一档。组织树是 sys_org,自定义勾选在 sys_role_data_scope(role_id + org_id),不是 sys_role_dept。模块级覆盖在 sys_role_module_data_scope。
DataScopeType 枚举自己的数字(SELF=2、CUSTOM=5、TENANT_ALL=6)和角色字典不是同一套。角色值必须走 getByRoleDataScope,不要按枚举常量硬套。
配置落在哪
| 表 | 作用 |
|---|---|
sys_data_scope_config | 哪个 Mapper、哪一列(user_id / org_id / tenant_id / region_code) |
sys_role | 角色默认范围 |
sys_role_data_scope | 自定义组织勾选 |
sys_role_module_data_scope | 按 module_code 覆盖默认范围 |
列名以配置为准。拦截器不会假定业务表一定有 create_dept,也不会去查 sys_dept。
Mapper 写法
需要过滤的查询写在 Mapper XML 里,让 mapperMethod 对得上:
xml
<select id="selectUserPage" resultType="SysUserVO">
SELECT u.id, u.username, u.create_dept
FROM sys_user u
WHERE u.del_flag = 0
ORDER BY u.create_time DESC
</select>不要在 Service 里用 LambdaQueryWrapper 拼列表查询再指望拦截器改写。
