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