Files
leaudit-platform-backend/docs/权限与地区隔离/大版本发布验收总表-2026-05-21.md
T

410 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 大版本发布验收总表(2026-05-21)
> 目标:把当前超大改动面压缩成可验收、可证明、可发布的 `RC` 版本。
> 原则:不再按“继续开发”推进,而按“关卡验收 -> 暴露故障 -> 定点修复 -> 回归通过”推进。
---
## 1. 发布前总原则
本次版本只有在以下条件同时满足时,才允许进入大版本推送:
1. 数据库结构与 SQL 脚本执行状态已确认
2. 所有 `P0` 关卡全部通过
3. 所有 `P1` 关卡全部通过
4. 关键页面与关键接口无 `500`
5.`UndefinedTable / UndefinedColumn` 级别错误
6. 核心租户边界验证完成
7. 发布说明、执行 SQL、上线步骤、观察项已整理完毕
---
## 2. 关卡定义
| 关卡 | 优先级 | 范围 | 当前状态 |
| --- | --- | --- | --- |
| `G0` | `P0` | 数据库结构与迁移脚本对齐 | 待验收 |
| `G1` | `P0` | 登录 / 当前用户 / RBAC / 租户上下文 | 已通过(人工重放 + Pytest |
| `G2` | `P0` | 租户管理 + 用户租户设置 | 已通过(人工重放 + Pytest |
| `G3` | `P0` | 首页入口 + 入口模块后台 + 新租户分配 | 已通过(人工重放 + Pytest |
| `G4` | `P0` | 文档 / 合同模板 / 公文 上传-列表-详情-边界 | 已通过(Pytest,文档主链路) |
| `G5` | `P1` | RAG 应用 / 知识库 / 会话 读写边界 | 部分通过(Pytest,当前真实权限模型) |
| `G6` | `P1` | 评查组 / 规则集 / 交叉评查 主链路 | 部分通过(Pytest,只读矩阵 + 建单边界) |
| `G7` | `P1` | 使用统计 / 审计快照 / 租户聚合 | 未开始 |
| `G8` | `P2` | 前端去角色硬编码与菜单/按钮一致性 | 未开始 |
---
## 3. 通过标准
每个关卡只允许有三种判定:
1. `通过`
2. `失败`
3. `未验证`
判定标准:
1. `通过`
- 有真实接口或真实页面操作证据
- 有明确返回结果
- 无日志级严重错误
2. `失败`
- 出现 4xx/5xx 且不符合预期
- 数据写错、查错、串租户、越权
- 页面与接口口径不一致
3. `未验证`
- 没有实际执行
- 只有历史日志,无本次独立重放
---
## 4. G0 数据库结构与脚本对齐
### 验收目标
确认这轮租户化与权限改造依赖的数据库对象,在**新数据库**中完整存在。
### 必验对象
1. `sys_tenants`
2. `sys_tenant_aliases`
3. `sys_tenant_feature_flags`
4. `leaudit_entry_module_tenants`
5. `sso_users.tenant_code`
6. 高风险阶段新增 `tenant_code` 字段与索引
### 通过标准
1. 表存在
2. 关键列存在
3. 索引存在或已确认可延后
4. 初始化种子不缺失到影响主链路
---
## 5. G1 登录 / RBAC / 租户上下文
### 核心用例
1. `POST /api/auth/login`
2. `GET /api/auth/me`
3. `GET /api/v3/rbac/users`
4. `GET /v3/rbac/roles`
5. `GET /api/rbac/user/routes`
6. `GET /admin/users/organizations/tree`
### 关注点
1. 登录是否正常签发 token
2. 当前用户是否返回正确 `tenant_code`
3. 用户列表是否按租户边界收敛
4. 路由列表是否正常返回
5. 组织树是否仍能正常读取
### 通过标准
1. `000` 可登录
2. `/api/auth/me` 返回 `tenant_code`
3. `RBAC` 只读接口无 `500`
4. 日志无 `UndefinedTable / UndefinedColumn`
---
## 6. G2 租户管理 + 用户租户设置
### 核心用例
1. `GET /api/v3/tenants`
2. `GET /api/v3/tenants/options`
3. `GET /api/v3/tenants/{tenantCode}`
4. `POST /api/v3/tenants`
5. `PUT /api/v3/tenants/{tenantCode}`
6. `PATCH /api/v3/tenants/{tenantCode}/status`
7. `PUT /api/v3/rbac/users/{userId}/tenant`
### 关注点
1. 租户能否真实新增
2. 新增后能否查到详情
3. 功能开关与能力字段能否正确保存
4. 用户租户更新后重新登录是否生效
5. 禁用租户时是否有引用保护
### 通过标准
1. 能新增一个测试租户
2. 能更新测试租户
3. 能启停测试租户
4. 能把用户切到测试租户并重新读取到正确上下文
---
## 7. G3 首页入口 + 入口模块后台 + 新租户分配
### 核心用例
1. `GET /api/home/entry-modules`
2. `GET /api/v3/entry-modules`
3. `GET /api/v3/entry-modules/{id}`
4. `POST /api/v3/entry-modules`
5. `PUT /api/v3/entry-modules/{id}`
6. `GET /api/v3/tenants/options?feature_key=home.entry_module`
### 关注点
1. 首页是否按当前用户租户展示入口
2. 后台列表/详情是否以 `tenants` 为主输出
3. 能否把新租户分配到入口模块
4. 新分配后首页是否能看到入口
### 通过标准
1. 现有入口读取正常
2. 新建或更新入口模块时可写入 `tenants`
3. 新租户分配后首页展示正确
4. 管理端和首页口径一致
---
## 8. G4 文档 / 合同模板 / 公文
### 核心用例
1. 文档上传
2. 文档列表
3. 文档详情
4. 附件追加
5. 合同模板上传
6. 公文上传与运行
### 通过标准
1. 写入不落错租户
2. 同租户可查可读
3. 跨租户不可见
4. 详情、附件、状态、运行链路不绕边界
---
## 9. G5 RAG
### 核心用例
1. 应用列表 / 默认应用
2. 会话列表 / 消息列表
3. 会话重命名 / 删除
4. 消息反馈 / StopMessage
5. 知识库创建 / 更新 / 删除
### 通过标准
1. 读链路正常
2. 写链路按租户边界收敛
3. 不再因角色名误放行
---
## 10. G6 评查组 / 规则集 / 交叉评查
### 核心用例
1. 评查组只读
2. 规则集只读
3. 规则版本创建 / 发布 / 回滚
4. 交叉评查建单
5. 补传文档
6. 成员与文档混租户拦截
### 通过标准
1. 只读链路正常
2. 敏感写操作不越权
3. 任务维度不串租户
---
## 11. 当前执行策略
本轮先执行并已固化为黑盒验收:
1. `G1`
2. `G2`
3. `G3`
4. `G4`
5. `G5`
6. `G6` 的首轮主链路矩阵
### 当前已完成补充
已新增 `pytest` 黑盒验收基座:
1. `tests/release/test_g1_rbac_context.py`
2. `tests/release/test_g2_g3_tenant_entry_chain.py`
3. `tests/release/test_role_tenant_matrix.py`
4. `tests/release/test_g4_documents.py`
5. `tests/release/test_g5_rag.py`
6. `tests/release/test_g5_rule_cross_review_matrix.py`
已通过结果:
1. 发布级黑盒验收总数:`16 passed`
2. `G1-G3`:已通过
3. 角色/租户矩阵基础:已通过
4. `G4` 文档跨租户读写边界:已通过
5. `G5` RAG 可见性与管理边界:按当前真实权限模型通过
6. `G6` 规则集/评查组只读矩阵与交叉评查建单边界:已通过
本轮验收中暴露并已修复:
1. `tenantServiceImpl._replaceTenantAliases()` 由“软删 + 重插”改为“物理删 + 重插”,解决 `PUT /api/v3/tenants/{tenantCode}` 的重复更新 `500`
执行规则:
1. 先验收
2. 出故障就只修该故障
3. 修完立刻回归
4. 不顺手扩散
---
## 12. 发布阻塞定义
以下任一项存在,直接判定为**不可推大版本**:
1. 关键写链路未验证
2. 出现 `500`
3. 出现 `UndefinedTable / UndefinedColumn`
4. 租户边界存在串数据或落错数据
5. 管理端与首页、前端与后端口径不一致
6. SQL 执行顺序和上线步骤未确认
---
## 13. 当前备注
当前仓库处于大改冻结态,后续所有推进都必须回写本总表和冻结版验收文档:
1. [冻结版进度盘点与最小冒烟验收-2026-05-21.md](/home/wren-dev/Porject/leaudit-platform/docs/权限与地区隔离/冻结版进度盘点与最小冒烟验收-2026-05-21.md)
2. 本文档
---
## 14. 本轮实测结果(G1-G3
### `G1` 登录 / RBAC / 租户上下文
判定:`通过`
实测通过:
1. `POST /api/auth/login`
2. `GET /api/auth/me`
3. `GET /api/v3/rbac/users?page=1&page_size=5`
4. `GET /api/rbac/user/routes`
5. `GET /api/admin/users/organizations/tree?include_users=false`
关键结果:
1. `000 / admin06111` 可正常登录
2. `/api/auth/me` 返回 `tenant_code=MZ`,后续切换后返回 `tenant_code=ZZRC1`
3. 组织树真实可用路径是 `/api/admin/users/organizations/tree`
说明:
1. 之前打 `/admin/users/organizations/tree` 得到 `404`,属于验收口径错误,不是后端能力缺失
### `G2` 租户管理 + 用户租户设置
判定:`通过`
实测通过:
1. `POST /api/v3/tenants`
2. `GET /api/v3/tenants/ZZRC1`
3. `PUT /api/v3/tenants/ZZRC1`
4. `PATCH /api/v3/tenants/ZZRC1/status`
5. `PUT /api/v3/rbac/users/5/tenant`
6. 重新登录后 `GET /api/auth/me`
本轮实际创建测试租户:
1. `tenant_code=ZZRC1`
2. `tenant_name=发布验收租户1-更新`
本轮修复:
1. 修复 [tenantServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/tenantServiceImpl.py) 中租户更新 `feature_flags` 时,软删后重插撞唯一约束导致的 `500`
### `G3` 首页入口 + 入口模块后台 + 新租户分配
判定:`通过`
实测通过:
1. `GET /api/home/entry-modules`
2. `GET /api/v3/tenants/options?feature_key=home.entry_module`
3. `GET /api/v3/entry-modules/2`
4. `PUT /api/v3/entry-modules/2`
5. 更新后再次 `GET /api/home/entry-modules`
关键结果:
1. `000` 切到 `ZZRC1` 后,首页初始返回空入口
2. 给模块 `2` 补充 `ZZRC1` 租户分配后,首页立即返回该入口
结论:
1. `租户主数据 -> 用户租户 -> 入口模块租户分配 -> 首页展示` 链路已被真实打通
---
## 15. 本轮新增实测结果(G4-G6)
### `G4` 文档上传 / 列表 / 详情 / 附件 / 删除边界
判定:`通过`
已由 `tests/release/test_g4_documents.py` 黑盒验证:
1. 租户 A 创建文档后,租户 A 可见、租户 B 不可见
2. 本租户管理员可更新本租户文档
3. 跨租户更新、追加附件、删除均被拒绝
4. 普通用户仅能看到自己创建的文档
5. 附件追加 `mergeMode=new` 当前真实行为为“生成新版本”,不是在原文档上原地追加
### `G5` RAG 应用 / 知识库 / 会话边界
判定:`部分通过`
已由 `tests/release/test_g5_rag.py` 黑盒验证的当前真实行为:
1. 全局管理员可创建并更新不同租户数据集
2. 租户管理员可读取本租户数据集详情
3. 租户管理员当前不能访问 `/api/v3/rag/datasets/admin`
4. 租户管理员当前不能创建或修改数据集
5. 本租户私有应用仅本租户可见,公共数据集挂载应用可跨租户可见
说明:
1. 这表示 `RAG` 当前已经具备租户可见性边界
2. 但“管理能力”仍保留在当前权限种子对应的全局管理侧,不能宣称已完成最终去角色化或最终权限化
### `G6` 评查组 / 规则集 / 交叉评查主链路
判定:`部分通过`
已由 `tests/release/test_g5_rule_cross_review_matrix.py` 黑盒验证:
1. 规则集元数据列表当前为全局可读
2. 规则绑定与评查组树已按入口模块租户映射做过滤
3. 交叉评查任务建单支持同租户正常创建
4. 建单时混入跨租户文档会返回 `403`
5. 建单时混入跨租户成员会返回 `403`
未纳入本轮通过范围:
1. 规则版本创建
2. 规则发布/回滚
3. 交叉评查后续提案、投票、归档深链路