feat: add tenant-scoped rule and permission management

This commit is contained in:
wren
2026-05-21 22:03:08 +08:00
parent a2c2bf1969
commit 1f1bccf3b3
193 changed files with 64463 additions and 1771 deletions
@@ -0,0 +1,302 @@
# 新平台主链路租户改造实施任务单
> 目标:把新平台主链路从“半租户化”推进到“关键链路 tenant-first”
> 当前优先级:先修会落错数据、查错范围、跨租户误改的链路
---
## T1 文档上传 tenant-first 收口
### 数据库变更
- 无强制新表
- 如当前库中还没有文档业务快照字段,需要补充:
- `leaudit_documents.root_group_id`
- `leaudit_documents.entry_module_id`
### 后端改造
- `Upload` 改为显式以 `tenant_code` 为主,不再依赖 `region` 主导归属
- 上传时校验:
- `group_id` 必须属于 `document_type_id`
- `group_id` 必须属于当前入口模块业务树
- `group_id` 必须属于当前租户允许范围
- 上传落库时持久化:
- `tenant_code`
- `group_id`
- `root_group_id`
- `entry_module_id`
### 前端改造
- 上传页显式提交 `tenant_code`
- 上传页不再仅传 `region`
- 上传页当前租户显式展示
### 验收点
- 同一文档类型、不同租户上传,不会再混入同一版本链
- 上传请求缺少 `tenant_code` 时,行为明确可控
- 非当前租户二级组 ID 无法上传成功
### 风险
- 历史旧文档若仍无 `tenant_code`,需要兼容迁移窗口
---
## T2 文档列表/详情停止 `tenant_code + region` 混查
### 数据库变更
- 如缺索引,确认:
- `idx_leaudit_documents_tenant_code`
- `idx_leaudit_documents_group_id`
### 后端改造
- 收紧 `_document_tenant_filter_sql`
- 收紧 `_buildDocumentScopeFilters`
- 收紧 `_find_latest_version_candidate`
- 停止危险的“`tenant_code` 不命中就退回 `region`
### 前端改造
- 文档列表请求显式带 `tenant_code`
- 列表页显示当前租户范围
### 验收点
- 同地区旧数据不会再被当成当前租户数据读出来
- 文档列表和详情在同一租户下口径一致
### 风险
- 某些历史脏数据可能在收紧后“暂时查不到”,需要预先判定为预期行为
---
## T3 文档业务边界快照固化
### 数据库变更
- 补字段:
- `leaudit_documents.root_group_id`
- `leaudit_documents.entry_module_id`
### 后端改造
- 上传落库时写入业务快照
- 列表/详情优先读持久化快照,不再运行时推断
- 减少 `COALESCE(d.group_id, inferred_group_id)` 这类推导
### 前端改造
- 无必须改动
- 后续可显示上传时绑定的业务子类型
### 验收点
- 分组树配置变化后,历史文档仍保持原业务归属
### 风险
- 需要一次性回填历史文档快照
---
## T4 RuleController 鉴权与权限补齐
### 数据库变更
-
### 后端改造
- `RuleController` 全量加 `verify_access_token`
- 补功能权限校验
- 统一透传当前租户上下文
### 前端改造
- 无必须改动
### 验收点
- 未登录不能直接访问规则接口
- 无权限用户不能读写规则版本和绑定
### 风险
- 可能暴露前端现有页面实际依赖“裸接口”的问题
---
## T5 评查组读链路 tenant-first 收口
### 数据库变更
- 短期可先不改表结构
- 中期需要评估给 `leaudit_evaluation_point_groups` 增加 `tenant_code`
### 后端改造
- `ListGroups`
- `ListAllGroups`
- `GetGroup`
- `GetChildren`
- `ListGroupsByDocumentTypes`
以上全部接入租户过滤
### 前端改造
- `rule-groups` 页面查询显式带 `tenant_code`
- 页面头部显示当前租户
### 验收点
- 不同租户打开分组页,看到的根组/子组不再混杂
### 风险
- 如果当前业务暂时仍共享分组树,需要先定义共享策略
---
## T6 评查组写链路 tenant-first 收口
### 数据库变更
- 中期大概率需要:
- `leaudit_evaluation_point_groups.tenant_code`
- `leaudit_rule_group_bindings.tenant_code`
### 后端改造
- `CreateGroup`
- `UpdateGroup`
- `DeleteGroup`
- `BatchDelete`
- `BatchUpdateStatus`
- `RebindGroup`
- `CreateBinding`
- `UpdateBinding`
- `DeleteBinding`
全部改成租户内操作
### 前端改造
- 编辑、删除、迁移前提示当前租户范围
### 验收点
- 无法跨租户误删、误绑、误迁移分组
### 风险
- `RebindGroup` 是最高危操作,必须单独加保护
---
## T7 规则版本与规则集归属模型重构
### 数据库变更
- 评估是否新增:
- `leaudit_rule_sets.tenant_code`
- `leaudit_rule_versions.tenant_code`
### 后端改造
- `CreateVersion`
- `PublishRuleVersion`
- `RollbackRuleVersion`
- `ListSets`
- `GetVersions`
- `GetContent`
全部明确租户归属模型
### 前端改造
- 规则列表/版本查看显示当前租户
### 验收点
- 一个租户发布规则版本,不会影响另一个租户同名规则类型
### 风险
- 这是最深层模型调整,需要最后做,不适合第一批直接大改
---
## T8 前端作用域上下文统一
### 数据库变更
-
### 后端改造
- 允许并鼓励所有主链路查询显式接受 `tenant_code`
### 前端改造
- 首页点击入口时带上 `tenant_code`
- sessionStorage 记录 `selectedTenantCode`
- 上传页、列表页、分组页、文档类型页全部统一读取/透传
### 验收点
- 跨页面刷新、跨模块进入后,租户上下文不丢失
### 风险
- 需要统一多页面的 scope 来源,避免出现多个来源互相覆盖
---
## T9 交叉评查跨租户策略明确化
### 数据库变更
- 可选补快照字段到 `leaudit_review_point_audits`
### 后端改造
- 明确 `_hasCrossReviewDocumentAccess` 是否允许跨租户
- 如果允许:
- 做显式特权链路
- 做审计快照
- 如果不允许:
- 收紧 bypass scope
### 前端改造
- 交叉评查页展示任务涉及租户
### 验收点
- 跨租户访问行为是“明确允许”而不是“意外绕过”
### 风险
- 这是业务策略题,改之前必须先拍板
---
## 当前建议执行顺序
1. `T1 文档上传 tenant-first 收口`
2. `T2 文档列表/详情停止 tenant_code + region 混查`
3. `T4 RuleController 鉴权与权限补齐`
4. `T5 评查组读链路 tenant-first 收口`
5. `T8 前端作用域上下文统一`
6. `T3 文档业务边界快照固化`
7. `T6 评查组写链路 tenant-first 收口`
8. `T9 交叉评查跨租户策略明确化`
9. `T7 规则版本与规则集归属模型重构`