Become a sponsor

概述
角色数据权限(role.data_scope)是叠加在租户隔离之上的第二层行级过滤,四档可配置。模块通过 DataScope: ApplyDataScope("dept_id") 一行声明接线,仅作用于 Page/List/导出。
| 档位 | 含义 | 过滤条件(作用于挂接模块的列表行) |
|---|---|---|
| 1 | 全部 | 不过滤(租户隔离之内全量) |
| 2 | 本部门及以下 | dept_id IN (自身部门 + 全部子孙部门 ID) |
| 3 | 本部门 | dept_id = 自身部门 ID |
| 4 | 仅本人 | id = 自身用户 ID |
档位文案走字典 role_data_scope(定稿种子已写入 dict/dict_item),角色表单"数据范围"下拉由字典驱动。
// internal/logic/user.go(真实接线方式)
userSpec = ModuleSpec[...]{ ...,
DataScope: ApplyDataScope("dept_id"),
}ApplyDataScope(deptColumn) 返回 DataScopeFunc 闭包(logic/data_scope.go,共享工厂),挂进 applyFilters 末环:
Like → Eq → Keyword → Filter → DataScope
租户/软删隔离由 dao.Ctx 先于本链注入接线后 Page/List/导出自动生效。目前仅 user 模块接线(全库仅 goframe_user 有 dept_id 列);其他模块需要时声明同款闭包即可,无部门归属列的表可按需扩展"按创建人过滤"变体。
第一层(硬规则,不可配置):租户隔离
dao.Ctx 注入 tenant_id IN(0,自身),先于一切业务过滤,任何模块不可绕过
第二层(可配置):角色数据范围
ModuleSpec.DataScope 挂点,applyFilters 末环叠加
两层独立:先租户收窄,再数据范围收窄五条语义
role 表 data_scope 列(默认 1)
→ 角色表单"数据范围"下拉(字典 role_data_scope 驱动,值 1/2/3/4)
→ roleToData 归一(缺省回 1,gvalid in:1,2,3,4 校验)
→ 角色 Update 后 AfterUpdate 清该角色全部用户身份缓存
→ 生效(新请求的 LoadIdentity 读到新档位)Page/Detail 返回 dataScope + dataScopeText(字典驱动),前端可展示当前角色数据范围。
GetDataScope(ctx) 档位(1-全部;未注入视为全部——旧缓存缺字段回退安全值)
GetDeptID(ctx) 当前用户部门 ID(0=未分配)两者由 JWT 中间件从身份缓存注入,业务代码一般不直接读(基座 DataScope 闭包内部消费)。