43 lines
2.0 KiB
Markdown
43 lines
2.0 KiB
Markdown
# 数据权限忽略与上下文覆盖说明
|
||
|
||
本文说明新增的公司/部门数据权限忽略能力,以及部门上下文对数据权限的覆盖策略。
|
||
|
||
## 新增注解
|
||
|
||
- `@CompanyDataPermissionIgnore(enable = "true")`
|
||
- `@DeptDataPermissionIgnore(enable = "true")`
|
||
|
||
用法:
|
||
- 可标记在类或方法上。
|
||
- `enable` 支持 Spring EL,计算结果为 `true` 时生效,默认开启。
|
||
- 生效后,在方法执行期间临时设置忽略标记,结束后自动恢复。
|
||
|
||
## 忽略生效范围
|
||
|
||
- 公司数据权限:切面在进入方法时将 `CompanyContextHolder.setIgnore(true)`,数据权限规则检测到后直接放行。
|
||
- 部门数据权限:切面在进入方法时将 `DeptContextHolder.setIgnore(true)`,部门数据权限规则检测到后直接放行。
|
||
|
||
## 部门上下文覆盖策略
|
||
|
||
当未忽略部门数据权限且上下文存在有效部门 ID 时:
|
||
- 优先使用上下文中的单一部门作为过滤条件,避免因默认的 `ALL` 或“无部门且不可查看自己”导致放行或误判无权。
|
||
- 上下文部门不会修改原有的数据权限 DTO,仅在当前计算中使用。
|
||
- 若上下文公司与缓存公司不一致,会记录告警日志,但仍按上下文部门过滤。
|
||
|
||
## 典型场景
|
||
|
||
1) **任务/全局调用需要暂时关闭数据权限**
|
||
- 在方法上标记 `@DeptDataPermissionIgnore` 或 `@CompanyDataPermissionIgnore`。
|
||
|
||
2) **带部门上下文的接口调用**
|
||
- 请求预先设置 `DeptContextHolder.setContext(deptId, companyId)`。
|
||
- 即便数据权限声明为 `all=true`,也会按该部门过滤,避免读出全量。
|
||
|
||
3) **无部门权限但指定了上下文部门**
|
||
- 即使 `deptIds` 为空且 `self=false`,只要上下文提供部门,也会使用该部门过滤,而非直接判定无权。
|
||
|
||
## 注意事项
|
||
|
||
- 忽略标记只作用于当前线程上下文,切面会在 `finally` 中恢复旧值,嵌套调用安全。
|
||
- 若需要同时忽略公司与部门数据权限,可叠加两个注解或在业务代码中分别设置忽略标记。
|