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