2.2 KiB
2.2 KiB
5.10 数据权限
:::tip 概述 数据权限是行级过滤:按角色的数据范围档位,在查询链上追加部门/本人条件。它与功能权限(Authz,能不能访问接口)严格分层——一个管"进不进得了门",一个管"看得到哪些数据"。 :::
四个档位
| 档位 | 含义 | 行级条件 |
|---|---|---|
| 1 | 全部 | 租户隔离之内不过滤 |
| 2 | 本部门及以下 | dept_id IN(自身部门 + 全部子孙部门) |
| 3 | 本部门 | dept_id = 自身部门 |
| 4 | 仅本人 | id = 自身用户 ID |
档位存在角色上(role.data_scope),多角色用户在身份装配层取最宽松。
生效链路
身份装配(LoadIdentity)→ ctx 携带数据范围档位 + deptID + userID
↓
ModuleSpec 声明挂接:DataScope: ApplyDataScope("dept_id")
↓
applyFilters 固定顺序最后一步执行(先软删/租户/查询条件,后数据范围)
↓
Page / List / 导出自动生效
Detail / Update / Delete 不过滤——由权限节点与租户隔离兜底(拿到 ID 越权访问单条的场景由权限码控制)。
挂接示例
// internal/service 内需数据权限的模块声明(以 userSpec 为例)
var userSpec = ModuleSpec[...]{
// ...
DataScope: ApplyDataScope("dept_id"), // 行上的部门列名
}
适用边界
| 适用 | 不适用 |
|---|---|
| 以用户为主体、行上有 dept_id 列的表(user 等) | 无部门列的行表(内容模块等)——不挂接本工厂 |
豁免机制:平台级身份与特定场景经 dataScopeBypass 豁免过滤(如超管全量可见)。
与租户隔离的关系
两层独立叠加,互不替代:
Scope 注入顺序:软删 del_flag=0 → 租户 tenant_id 条件 →(applyFilters 链)→ 数据范围
租户隔离保证"看不到别的租户",数据权限保证"本租户内按部门/本人收敛"。
配置与调试
- 档位在角色管理界面设置
- 调试时可对比同一接口以不同角色调用的结果集差异
- 超管(平台级)不受数据权限约束,用于管理与稽核