Files
easygoadmin-wiki/EasyGoAdmin_Gin_EleVue/zh/core/data-scope.md
T
2026-10-25 17:24:27 +08:00

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 链)→ 数据范围

租户隔离保证"看不到别的租户",数据权限保证"本租户内按部门/本人收敛"。

配置与调试

  • 档位在角色管理界面设置
  • 调试时可对比同一接口以不同角色调用的结果集差异
  • 超管(平台级)不受数据权限约束,用于管理与稽核

下一步

→ 5.11 字典模块