feat: add tenant-scoped rule and permission management
This commit is contained in:
@@ -0,0 +1,408 @@
|
||||
# 权限测试验收与回归用例清单
|
||||
|
||||
> 适用范围:权限架构统一改造后的联调、验收、灰度、回归阶段
|
||||
> 文档定位:把“角色、权限、地区、模块、接口、菜单、下载、导出”的测试口径一次性拉平。
|
||||
|
||||
---
|
||||
|
||||
## 1. 测试目标
|
||||
|
||||
本轮权限改造的核心验收目标不是“接口能用”,而是以下 6 件事同时成立:
|
||||
|
||||
1. 功能权限正确
|
||||
2. 数据范围正确
|
||||
3. 多角色合并正确
|
||||
4. `DENY` 优先正确
|
||||
5. 菜单、页面、按钮、接口边界一致
|
||||
6. 详情、下载、导出、删除等派生接口不绕过主资源边界
|
||||
|
||||
---
|
||||
|
||||
## 2. 测试范围
|
||||
|
||||
本次至少覆盖以下模块:
|
||||
|
||||
- 文档
|
||||
- 公文
|
||||
- 使用统计
|
||||
- RAG
|
||||
- 交叉评查
|
||||
- RBAC 管理
|
||||
- 合同模板
|
||||
- 首页入口与菜单
|
||||
|
||||
不作为本轮重点但要做冒烟确认:
|
||||
|
||||
- 规则
|
||||
- 规则配置
|
||||
- 评查点分组
|
||||
|
||||
---
|
||||
|
||||
## 3. 测试前置准备
|
||||
|
||||
## 3.1 角色准备
|
||||
|
||||
建议准备最少 6 类测试账号:
|
||||
|
||||
1. `super_admin`
|
||||
2. `provincial_admin`
|
||||
3. `admin`-A 地区
|
||||
4. `admin`-B 地区
|
||||
5. `common`-A 地区
|
||||
6. `common`-B 地区
|
||||
|
||||
建议再补 3 类组合账号:
|
||||
|
||||
1. `common + admin` 同地区多角色用户
|
||||
2. `admin + DENY 某权限` 用户
|
||||
3. 自定义角色用户:不叫 `admin/provincial_admin`,但拥有相同 permission 与 scope
|
||||
|
||||
最后这类用户极关键,用于验证“去角色硬编码后系统是否仍正确工作”。
|
||||
|
||||
## 3.2 数据准备
|
||||
|
||||
建议准备以下数据:
|
||||
|
||||
1. A 地区文档 3 份
|
||||
2. B 地区文档 3 份
|
||||
3. A 地区公文 3 份
|
||||
4. B 地区公文 3 份
|
||||
5. A 地区合同模板 2 份
|
||||
6. B 地区合同模板 2 份
|
||||
7. 省级 RAG 数据集 2 个
|
||||
8. A 地区 RAG 数据集 2 个
|
||||
9. B 地区 RAG 数据集 2 个
|
||||
10. 公共 RAG 数据集 1 个
|
||||
11. 交叉评查任务至少 2 个,分别覆盖成员 A/B 差异
|
||||
|
||||
## 3.3 授权准备
|
||||
|
||||
建议为每类 permission 准备三种授权状态:
|
||||
|
||||
1. `GRANT + ALL`
|
||||
2. `GRANT + DEPT`
|
||||
3. `GRANT + SELF`
|
||||
|
||||
同时至少准备一个 `DENY` 用例:
|
||||
|
||||
- 对同一个用户,某权限被更高优先级角色 `DENY`
|
||||
|
||||
---
|
||||
|
||||
## 4. 验收口径
|
||||
|
||||
验收统一按三层判断:
|
||||
|
||||
1. `403`
|
||||
- 说明功能权限被拒绝
|
||||
2. `200 + 空数据`
|
||||
- 说明功能权限有,但数据范围无命中
|
||||
3. `200 + 仅返回应有数据`
|
||||
- 说明 scope 正确
|
||||
|
||||
不能把 `空列表` 和 `403` 混为一谈。
|
||||
|
||||
---
|
||||
|
||||
## 5. 角色矩阵用例
|
||||
|
||||
## 5.1 全局范围用户
|
||||
|
||||
用例编号:`ROLE-ALL-*`
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `ROLE-ALL-01` | `super_admin` 查询文档列表 | 可见全部地区文档 |
|
||||
| `ROLE-ALL-02` | `provincial_admin` 查询使用统计地区汇总 | 可见全部地区 |
|
||||
| `ROLE-ALL-03` | `provincial_admin` 管理 RAG 数据集 | 可管理全部地区或省级数据集 |
|
||||
| `ROLE-ALL-04` | 全局用户下载任意本系统有权限公文报告 | 成功 |
|
||||
|
||||
## 5.2 地区范围用户
|
||||
|
||||
用例编号:`ROLE-DEPT-*`
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `ROLE-DEPT-01` | A 地区 `admin` 查文档列表 | 仅可见 A 地区 |
|
||||
| `ROLE-DEPT-02` | A 地区 `admin` 指定 `region=B` 查文档 | 拒绝或自动收敛,不能看到 B |
|
||||
| `ROLE-DEPT-03` | A 地区 `admin` 查 RBAC 用户列表 | 仅可见 A 地区用户 |
|
||||
| `ROLE-DEPT-04` | A 地区 `admin` 创建 RAG 数据集并指定 B 地区 | 拒绝 |
|
||||
|
||||
## 5.3 自身范围用户
|
||||
|
||||
用例编号:`ROLE-SELF-*`
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `ROLE-SELF-01` | `common` 查文档列表 | 仅本人上传文档 |
|
||||
| `ROLE-SELF-02` | `common` 查使用统计明细 | 仅本人登录/上传/评查明细 |
|
||||
| `ROLE-SELF-03` | `common` 查合同模板详情 | 仅在本人可见范围内成功 |
|
||||
| `ROLE-SELF-04` | `common` 删除他人文档 | 拒绝 |
|
||||
|
||||
## 5.4 去角色硬编码验证
|
||||
|
||||
用例编号:`ROLE-DEC-*`
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `ROLE-DEC-01` | 自定义角色用户拥有 `rag:dataset:manage + DEPT` | 应能管理本地区 RAG 数据集,即便角色名不是 `admin` |
|
||||
| `ROLE-DEC-02` | 自定义角色用户拥有 `contract_template:create:write + DEPT` | 应可创建本地区模板 |
|
||||
| `ROLE-DEC-03` | 自定义角色用户拥有 `rbac:user_roles:write + DEPT` | 应可管理本地区用户角色 |
|
||||
| `ROLE-DEC-04` | 角色名是 `admin` 但缺少目标 permission | 应被拒绝,不能因角色名放行 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 多角色与 DENY 用例
|
||||
|
||||
用例编号:`MERGE-*`
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `MERGE-01` | 用户同时拥有 `documents:list:read + SELF` 与 `documents:list:read + DEPT` | 取更大范围 `DEPT` |
|
||||
| `MERGE-02` | 用户同时拥有 `documents:list:read + DEPT` 与 `documents:list:read + ALL` | 取 `ALL` |
|
||||
| `MERGE-03` | 用户有 `documents:list:read + ALL`,另一角色 `DENY documents:list:read` | 最终拒绝 |
|
||||
| `MERGE-04` | 用户拥有 `rag:dataset:read + PUBLIC_MIXED`,另一角色 `DENY rag:dataset:update` | 可读不可改 |
|
||||
| `MERGE-05` | 用户有 `rbac:users:read + DEPT` 和 `rbac:roles:read + NONE` | 用户列表仍限本地区,角色列表正常 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 文档模块用例
|
||||
|
||||
用例编号:`DOC-*`
|
||||
|
||||
## 7.1 列表与详情一致性
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `DOC-01` | 列表可见文档点进详情 | 成功 |
|
||||
| `DOC-02` | 列表不可见文档直接访问详情 ID | 拒绝或 404 |
|
||||
| `DOC-03` | 列表不可见文档请求状态接口 | 不返回该文档状态 |
|
||||
| `DOC-04` | 列表不可见文档请求评查点聚合 | 拒绝 |
|
||||
|
||||
## 7.2 写操作一致性
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `DOC-05` | 本人文档追加附件 | 成功 |
|
||||
| `DOC-06` | 非本人、非本地区文档追加附件 | 拒绝 |
|
||||
| `DOC-07` | 本地区管理员删除本地区文档 | 成功 |
|
||||
| `DOC-08` | 本地区管理员删除外地区文档 | 拒绝 |
|
||||
| `DOC-09` | `SELF` 用户确认他人文档评查结果 | 拒绝 |
|
||||
|
||||
## 7.3 上传边界
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `DOC-10` | `DEPT` 用户上传文档时指定本地区 | 成功 |
|
||||
| `DOC-11` | `DEPT` 用户上传文档时指定外地区 | 拒绝或强制改写为本地区 |
|
||||
| `DOC-12` | `ALL` 用户上传并指定任意地区 | 成功 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 公文模块用例
|
||||
|
||||
用例编号:`GOV-*`
|
||||
|
||||
## 8.1 文档链路
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `GOV-01` | 可见公文在列表、详情均可访问 | 成功 |
|
||||
| `GOV-02` | 不可见公文详情直连 | 拒绝或 404 |
|
||||
| `GOV-03` | 删除可见公文 | 成功 |
|
||||
| `GOV-04` | 删除不可见公文 | 拒绝 |
|
||||
|
||||
## 8.2 运行结果与报告链路
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `GOV-05` | 对可见公文发起 run | 成功 |
|
||||
| `GOV-06` | 对不可见公文发起 run | 拒绝 |
|
||||
| `GOV-07` | 通过 `runId` 查看结果,但所属公文不在 scope | 拒绝 |
|
||||
| `GOV-08` | 通过 `runId` 下载 docx 报告,但所属公文不在 scope | 拒绝 |
|
||||
| `GOV-09` | 下载原始公文,但所属公文不在 scope | 拒绝 |
|
||||
|
||||
---
|
||||
|
||||
## 9. 使用统计模块用例
|
||||
|
||||
用例编号:`STAT-*`
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `STAT-01` | 全局用户看 `overview` | 全量数据 |
|
||||
| `STAT-02` | 地区用户看 `overview` | 仅本地区 |
|
||||
| `STAT-03` | `SELF` 用户看 `overview` | 仅自己相关数据或受限简版 |
|
||||
| `STAT-04` | 地区用户 `areaScope=user` 指定外地区 | 拒绝或无数据 |
|
||||
| `STAT-05` | 地区用户 `areaScope=document` 指定外地区 | 拒绝或无数据 |
|
||||
| `STAT-06` | `by-users` 指定他人 `userId`,但不在当前 scope | 拒绝或无数据 |
|
||||
| `STAT-07` | `details` 接口查看他人上传明细 | 按 scope 正确收敛 |
|
||||
| `STAT-08` | `by-areas` 对 `SELF` 用户 | 建议拒绝或返回受限结果 |
|
||||
|
||||
---
|
||||
|
||||
## 10. RAG 模块用例
|
||||
|
||||
用例编号:`RAG-*`
|
||||
|
||||
## 10.1 阅读边界
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `RAG-01` | A 地区用户查看 A 地区数据集 | 成功 |
|
||||
| `RAG-02` | A 地区用户查看 B 地区私有数据集 | 拒绝 |
|
||||
| `RAG-03` | A 地区用户查看省级数据集 | 成功 |
|
||||
| `RAG-04` | A 地区用户查看 `is_public=true` 数据集 | 成功 |
|
||||
| `RAG-05` | 默认应用与应用列表展示边界一致 | 一致 |
|
||||
|
||||
## 10.2 管理边界
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `RAG-06` | 拥有 `rag:dataset:manage + DEPT` 的自定义角色访问 `/datasets/admin` | 成功 |
|
||||
| `RAG-07` | 无 `manage` 但角色名是 `admin` 的用户访问 `/datasets/admin` | 拒绝 |
|
||||
| `RAG-08` | `DEPT` 用户创建外地区数据集 | 拒绝 |
|
||||
| `RAG-09` | `DEPT` 用户修改本地区数据集 | 成功 |
|
||||
| `RAG-10` | `DEPT` 用户删除外地区数据集 | 拒绝 |
|
||||
| `RAG-11` | 数据集文档上传、重处理、删除边界与数据集边界一致 | 一致 |
|
||||
|
||||
## 10.3 会话边界
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `RAG-12` | 查看自己会话 | 成功 |
|
||||
| `RAG-13` | 查看他人会话 | 拒绝 |
|
||||
| `RAG-14` | 删除他人会话 | 拒绝 |
|
||||
|
||||
---
|
||||
|
||||
## 11. 交叉评查模块用例
|
||||
|
||||
用例编号:`CR-*`
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `CR-01` | 任务成员查询自己参与任务 | 成功 |
|
||||
| `CR-02` | 非成员查询任务 | 拒绝或无数据 |
|
||||
| `CR-03` | 任务成员查看任务文档 | 成功 |
|
||||
| `CR-04` | 非成员查看任务文档 | 拒绝 |
|
||||
| `CR-05` | 非负责角色调用 `can-confirm` | 拒绝或返回不可确认 |
|
||||
| `CR-06` | 非成员上传任务文档 | 拒绝 |
|
||||
| `CR-07` | 非成员追加附件 | 拒绝 |
|
||||
| `CR-08` | 可投票成员投票 | 成功 |
|
||||
| `CR-09` | 非可投票成员投票 | 拒绝 |
|
||||
| `CR-10` | 非成员导出提案 | 拒绝 |
|
||||
|
||||
重点:
|
||||
|
||||
- 交叉评查不能按地区矩阵替代成员关系矩阵
|
||||
- 这组测试必须围绕“关系模型”设计
|
||||
|
||||
---
|
||||
|
||||
## 12. RBAC 管理域用例
|
||||
|
||||
用例编号:`RBAC-*`
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `RBAC-01` | 地区管理员查看用户列表 | 仅本地区 |
|
||||
| `RBAC-02` | 地区管理员查询外地区用户角色 | 拒绝或无数据 |
|
||||
| `RBAC-03` | 地区管理员给本地区用户分配角色 | 成功 |
|
||||
| `RBAC-04` | 地区管理员给外地区用户分配角色 | 拒绝 |
|
||||
| `RBAC-05` | 无 `rbac:user_roles:write` 但角色名是 `admin` | 拒绝 |
|
||||
| `RBAC-06` | 角色权限配置保存后,权限即时生效或在缓存期内按预期生效 | 正确 |
|
||||
| `RBAC-07` | `DENY` 权限配置后,用户访问对应接口 | 被拒绝 |
|
||||
|
||||
---
|
||||
|
||||
## 13. 合同模板模块用例
|
||||
|
||||
用例编号:`TPL-*`
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `TPL-01` | 全局用户查看全部模板 | 成功 |
|
||||
| `TPL-02` | 地区用户查看模板列表 | 仅本地区 + 公共/省级范围内模板 |
|
||||
| `TPL-03` | `SELF` 用户查看本人模板 | 仅本人可见 |
|
||||
| `TPL-04` | 拥有 `contract_template:create:write + DEPT` 的自定义角色上传模板 | 成功 |
|
||||
| `TPL-05` | 前端角色名不是 `admin` 但拥有权限 | 页面上传入口应可见 |
|
||||
| `TPL-06` | 无权限但前端强行调创建接口 | 后端拒绝 |
|
||||
| `TPL-07` | 删除外地区模板 | 拒绝 |
|
||||
|
||||
---
|
||||
|
||||
## 14. 菜单、页面、按钮一致性用例
|
||||
|
||||
用例编号:`UI-*`
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `UI-01` | 菜单可见页面,接口也应可访问 | 一致 |
|
||||
| `UI-02` | 菜单不可见页面,直接输入 URL | 后端仍能防越权 |
|
||||
| `UI-03` | 按钮不可见时,直调接口 | 后端仍能防越权 |
|
||||
| `UI-04` | 数据库路由撤销后,前端 fallback 不应继续展示旧菜单 | 一致 |
|
||||
| `UI-05` | 自定义角色用户拥有权限但不是旧硬编码角色 | 菜单、按钮按 permission 展示 |
|
||||
|
||||
---
|
||||
|
||||
## 15. 下载、导出、详情专项
|
||||
|
||||
用例编号:`RES-*`
|
||||
|
||||
这组是本轮最重要回归项。
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `RES-01` | 文档详情不可见时,评查点接口也不可见 | 一致 |
|
||||
| `RES-02` | 公文详情不可见时,原文下载不可用 | 一致 |
|
||||
| `RES-03` | 公文详情不可见时,报告下载不可用 | 一致 |
|
||||
| `RES-04` | 交叉评查文档不可见时,提案导出不可用 | 一致 |
|
||||
| `RES-05` | RAG 数据集不可见时,其文档和分段明细不可见 | 一致 |
|
||||
|
||||
---
|
||||
|
||||
## 16. 缓存与生效时效用例
|
||||
|
||||
用例编号:`CACHE-*`
|
||||
|
||||
| 编号 | 场景 | 预期 |
|
||||
| --- | --- | --- |
|
||||
| `CACHE-01` | 给用户新增 permission | 在预期缓存时间内生效 |
|
||||
| `CACHE-02` | 给用户新增 `DENY` | 在预期缓存时间内生效,且优先于旧 `GRANT` |
|
||||
| `CACHE-03` | 修改用户地区 `area` | 列表、详情、菜单能力按新地区收敛 |
|
||||
| `CACHE-04` | 修改角色 `data_scope` | 对应接口边界变化符合预期 |
|
||||
|
||||
---
|
||||
|
||||
## 17. 灰度观察指标
|
||||
|
||||
灰度期建议至少看以下指标:
|
||||
|
||||
1. `403` 数量按模块趋势
|
||||
2. RAG `/datasets/admin` 相关接口报错量
|
||||
3. 公文 `report/docx`、`original` 下载失败量
|
||||
4. 交叉评查导出失败量
|
||||
5. RBAC 用户角色分配失败量
|
||||
6. 前端菜单请求与接口拒绝不一致量
|
||||
|
||||
若出现明显上涨,应优先排查:
|
||||
|
||||
- scope 决策错误
|
||||
- 前端仍沿用旧角色判断
|
||||
- 详情/下载类接口未接统一执行器
|
||||
|
||||
---
|
||||
|
||||
## 18. 通过标准
|
||||
|
||||
验收通过建议满足以下门槛:
|
||||
|
||||
1. P0 模块用例通过率 100%
|
||||
2. 所有 `DENY` 用例通过
|
||||
3. 自定义角色去硬编码用例通过
|
||||
4. 列表/详情/下载/导出一致性用例通过
|
||||
5. 灰度期无明显越权投诉或异常日志
|
||||
|
||||
如果以上任一项未达标,本轮权限改造不应视为完成。
|
||||
Reference in New Issue
Block a user