Skip to content

数据权限规则

Forge 通过 DataScopeInterceptor 做行级过滤。它和 @SaCheckPermission 不是一回事。

数据权限 vs 功能权限

维度功能权限数据权限
入口@SaCheckPermissionDataScopeInterceptor + sys_data_scope_config
粒度接口能不能进能看见哪些行
作用层ControllerMapper 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_scoperole_id + org_id),不是 sys_role_dept。模块级覆盖在 sys_role_module_data_scope

DataScopeType 枚举自己的数字(SELF=2CUSTOM=5TENANT_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_scopemodule_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 拼列表查询再指望拦截器改写。

相关文档