Files
YG_FT/docs/权限验收测试用例.md
wuyongtao 6f0e82f351 feat: 平台治理与权限体系完善,存储进度/GPU预留/审批中心与日志整合
- 平台治理: 租户用户权限层次、资源ACL、审批中心与审批模板、访问申请
- 存储: MinIO 存储进度迁移、对象存储安全加固与测试
- 计算: GPU 资源预留、compute 轮询与同步增强
- 权限: permission v2 迁移、权限安全验收测试
- 日志: 后端运行日志中文说明、操作日志整合
- 数据处理/评测: 数据转换与模型评测优化

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 09:49:48 +08:00

228 lines
13 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.
# 权限验收测试用例
> 版本:权限 2.0 前端权限页面收口版
> 编写日期2026-08-20
> 适用系统YG_FT 微调平台主工程、Backend、Frontend、Compute Agent、PostgreSQL、Redis、MinIO
> 说明:本文件将自动化验证、单节点页面验证和多用户/多节点专项验证分开记录。
## 1. 验收目标
验证平台权限功能是否能够形成以下闭环:
`登录认证 → 页面权限 → 租户成员 → 资源创建 → ACL/访问申请 → 审批 → 训练/评测/推理执行 → GPU/配额预留 → 任务释放 → 审计 → 软删除和对象清理`
验收重点:
- 前端页面是否提供完整的权限管理入口。
- 普通用户是否可以提交访问申请、查看自己的申请和接受租户邀请。
- 管理员是否可以配置用户页面权限、租户成员、租户配额、资源 ACL 和审批策略。
- 页面按钮隐藏只是辅助体验,直接调用接口仍必须由后端返回 401/403。
- 用户、租户、资源、ACL、审批、GPU、配额和 MinIO 对象状态是否能够保持一致。
## 2. 测试环境
### 2.1 服务
| 服务 | 地址/容器 | 验收要求 |
|---|---|---|
| Frontend | `http://127.0.0.1:16801` | 页面可打开,路由切换无白屏 |
| Backend | `http://127.0.0.1:17861/modelTF` | 健康接口返回成功 |
| Compute API | `http://172.25.179.69:19100` | 当前可达节点可进行单节点验证 |
| Redis | WSL Docker `yg-ft-redis` | 容器 healthy |
| MinIO | WSL Docker `yg-ft-minio` | 容器 healthy可进行对象读写 |
| PostgreSQL | 当前环境实际远程 PostgreSQL | 初始化字段和增量迁移均存在 |
### 2.2 测试账号和数据
准备以下测试对象,禁止使用生产账号和真实敏感数据:
| 对象 | 建议值 | 说明 |
|---|---|---|
| 平台管理员 | 当前环境管理员账号 | 执行用户、租户、ACL、审批和配额管理 |
| 普通用户 A | 新建测试用户 | 作为资源所有者 |
| 普通用户 B | 新建测试用户 | 作为被授权用户和申请人 |
| 租户 A | 新建测试租户 | 与租户 B 隔离验证 |
| 租户 B | 新建测试租户 | 跨租户访问验证 |
| 测试数据集 | `test_data_0817` 或新的小数据集 | 用于 ACL、训练和下载验证 |
| 测试模型 | `qwen3.5-0.8B` | 用于模型使用权限和推理验证 |
## 3. 自动化验证结果
以下项目已在当前开发环境执行:
| 编号 | 验证内容 | 结果 |
|---|---|---|
| AUTO-01 | `npm run build` | 通过;仅有既有 Font Awesome 路径和 chunk size 警告 |
| AUTO-02 | `test_permission_security.py` | 通过8 passed |
| AUTO-03 | `test_storage_security.py` | 已包含在 8 passed 中 |
| AUTO-04 | 后端权限文件 `py_compile` | 通过 |
| AUTO-05 | `git diff --check` | 通过 |
| AUTO-06 | Backend、Frontend、Compute、Redis、MinIO 容器状态 | 通过Backend healthy |
| AUTO-07 | 迁移后字段核对 | 通过users、eval_tasks、compare_tasks、data_convert_tasks、storage_objects 字段存在 |
| AUTO-08 | 临时用户软删除闭环 | 通过,状态为 deleted、存在 deleted_at原凭据登录返回 401 |
| AUTO-09 | `docker/offline/src` 同步 | 通过,离线 SQL 目录只保留 `000_full_init.sql` |
## 4. 前端页面验收
### 4.1 组织与权限
页面入口:`/organization`
| 用例 | 操作步骤 | 预期结果 |
|---|---|---|
| UI-ORG-01 | 管理员打开“组织与权限” | 显示“用户与角色”“租户与配额”两个页签 |
| UI-ORG-02 | 点击“创建用户” | 进入用户创建页面,可填写账号、角色、状态和页面权限 |
| UI-ORG-03 | 创建普通用户 | 默认授予业务页面权限,不自动授予组织管理和算力节点权限 |
| UI-ORG-04 | 用户列表点击“权限” | 进入 `/user-settings/:id/permission`,显示用户角色、所属租户、状态和权限矩阵 |
| UI-ORG-05 | 修改用户页面权限并保存 | 页面提示保存成功,刷新后权限保持一致 |
| UI-ORG-06 | 将普通用户改为管理员 | 页面显示全部权限;保存时自动补齐全部权限码 |
| UI-ORG-07 | 查看已软删除用户 | 显示“已删除”,权限页只读,不能重新激活 |
| UI-ORG-08 | 普通用户访问组织与权限 | 路由跳转到无权访问页,菜单不显示管理员治理入口 |
### 4.2 租户与配额
页面入口:`/organization?tab=tenants``/tenants/:id`
| 用例 | 操作步骤 | 预期结果 |
|---|---|---|
| UI-TEN-01 | 管理员创建租户并设置 GPU、存储配额 | 租户列表出现新租户,配额显示正确 |
| UI-TEN-02 | 打开租户详情 | 显示租户信息、配额设置、GPU 预留量和成员列表 |
| UI-TEN-03 | 邀请成员并设置角色、邀请有效期 | 页面提示邀请成功,成员状态为待接受,过期时间正确 |
| UI-TEN-04 | 修改成员角色 | 成员列表角色更新,不能通过页面授予非法 owner 权限 |
| UI-TEN-05 | 移除成员 | 成员状态/关系更新,后续资源访问按后端权限拒绝 |
| UI-TEN-06 | 保存配额 | 配额配置更新,已预留 GPU 数量不超过新配额 |
### 4.3 我的申请与租户邀请
页面入口:`/approval-instances?tab=mine``/approval-instances?tab=access``/approval-instances?tab=invitations`
| 用例 | 操作步骤 | 预期结果 |
|---|---|---|
| UI-SELF-01 | 普通用户打开审批中心 | 可进入,不再被管理员专属路由拦截 |
| UI-SELF-02 | 打开“访问申请” | 可选择可见的数据集/训练模型,资源名称优先显示中文名称,同时保留 ID |
| UI-SELF-03 | 提交 read/execute/download 申请 | 申请出现在“我的访问申请”,状态为审批中 |
| UI-SELF-04 | 撤回待审批申请 | 二次确认后状态变为已撤回,不能再次撤回 |
| UI-SELF-05 | 打开“租户邀请” | 显示租户、角色、邀请人、有效期和状态 |
| UI-SELF-06 | 接受有效邀请 | 状态变为已加入,获得对应租户成员关系 |
| UI-SELF-07 | 接受过期邀请 | 后端拒绝,页面显示失败原因,成员关系不产生 |
### 4.4 资源授权
页面入口:`/resource-acl`
| 用例 | 操作步骤 | 预期结果 |
|---|---|---|
| UI-ACL-01 | 管理员选择数据集或训练模型 | 显示资源名称和资源 ID不显示已软删除资源 |
| UI-ACL-02 | 查看资源 ACL | 显示用户/租户角色、主体类型和权限标签 |
| UI-ACL-03 | 增加用户 ACL | 可选择查看、编辑、使用、下载等权限并保存 |
| UI-ACL-04 | 增加角色 ACL | 可选择租户管理员、成员、只读角色;后端校验最终结果 |
| UI-ACL-05 | 移除全部 ACL | 页面二次确认后保存空 ACL授权全部撤销 |
| UI-ACL-06 | ACL 查询失败 | 页面显示明确错误提示,不把失败误显示为空授权 |
| UI-ACL-07 | 普通用户打开资源授权页面 | 页面入口隐藏,直接访问接口返回 403 |
### 4.5 审批中心
页面入口:`/approval-instances`
| 用例 | 操作步骤 | 预期结果 |
|---|---|---|
| UI-APP-01 | 管理员打开审批申请 | 显示资源类型、申请事项、申请人、状态和当前步骤的中文信息 |
| UI-APP-02 | 管理员打开审批策略 | 可配置指定用户、租户管理员、平台管理员审批步骤,不需要输入 JSON |
| UI-APP-03 | 指定审批人审批 | 只能由当前会话指定审批人执行,审批结果和意见可见 |
| UI-APP-04 | 申请人查看自己的申请 | 只能看到自己的申请,不显示其他租户的审批数据 |
| UI-APP-05 | 审批通过 | ACL、GPU 分配或成员关系等业务效果真正落地 |
| UI-APP-06 | 审批拒绝/过期 | 状态明确显示,不能产生授权或资源占用 |
## 5. 后端接口与页面联动验收
| 用例 | 操作步骤 | 预期结果 |
|---|---|---|
| API-AUTH-01 | 未登录访问任意受保护页面接口 | 返回 401前端回到登录页 |
| API-AUTH-02 | 普通用户直接调用管理员接口 | 返回 403不能仅依赖前端隐藏按钮 |
| API-AUTH-03 | 禁用用户使用旧 Token | 返回 401 或明确无效会话错误 |
| API-AUTH-04 | 已删除用户登录 | 返回 401 |
| API-TEN-01 | 用户访问其他租户资源详情 | 返回 403 或资源不存在,不泄露资源内容 |
| API-TEN-02 | 过期成员访问租户资源 | 返回 403 |
| API-ACL-01 | 没有 read 的用户读取资源 ACL | 返回 403 |
| API-ACL-02 | 只有 read 的用户执行模型推理 | 返回 403 |
| API-ACL-03 | 只有 execute 的用户下载模型 | 返回 403 |
| API-ACL-04 | ACL 授权后重新访问 | 按授权动作成功 |
| API-APP-01 | 申请人提交自己的审批决策 | 返回 403 |
| API-APP-02 | 非指定审批人提交决策 | 返回 403 |
| API-APP-03 | 重复提交相同资源访问申请 | 复用或拒绝重复待审批申请,不重复写 ACL |
| API-LIFE-01 | 删除用户 | 会话、成员、ACL、GPU 分配、待审批项和用户资源状态同步处理 |
| API-LIFE-02 | 执行存储清理 | 已删除 MinIO 对象进入清理,失败任务可重试 |
## 6. 训练、评测、推理权限验收
| 用例 | 操作步骤 | 预期结果 |
|---|---|---|
| JOB-01 | 用户使用无权限数据集创建训练 | 预检失败,显示数据集无权限 |
| JOB-02 | 用户使用授权数据集创建训练 | 预检通过GPU 和租户配额原子预留 |
| JOB-03 | 用户使用未授权训练模型推理 | 页面提示无权限,接口返回 403 |
| JOB-04 | 用户使用已授权训练模型推理 | 可选择有权限的算力节点和 GPU 卡 |
| JOB-05 | 用户没有 download 权限导出模型 | 操作按钮不显示,接口返回 403 |
| JOB-06 | 评测任务结束 | GPU 预留和租户配额预留释放 |
| JOB-07 | 推理任务删除 | 推理服务释放任务软删除ACL 状态撤销 |
| JOB-08 | 节点不可达或 MinIO 暂时不可用 | 任务进入失败/重试状态,不留下永久 GPU 或配额占用 |
## 7. GPU、配额和多节点专项验收
以下用例需要第二个可达节点或一个包含多张可分配 GPU 卡的节点,当前单节点环境暂保留。
| 用例 | 操作步骤 | 预期结果 |
|---|---|---|
| GPU-01 | 租户 GPU 配额设置为 1同时提交两个 GPU 任务 | 第二个任务被拒绝,不能超配 |
| GPU-02 | 同一节点同一张卡由两个用户申请 | 审批/分配阶段返回 409不能重复占用 |
| GPU-03 | 同一节点选择两张空闲卡 | 任务使用页面指定的两张卡,不使用其他卡 |
| GPU-04 | 任务失败或取消 | GPU 分配和配额预留释放 |
| GPU-05 | Backend 重启后恢复任务状态 | 已完成/失败任务不重复占用;运行任务保持可对账 |
| GPU-06 | 模型训练、推理、评测选择不同节点 | 模型和数据从 MinIO 准备到指定节点,不错误派发到其他节点 |
| GPU-07 | 节点失联 | 任务进入失败或待重试,资源占用在超时后回收 |
## 8. MinIO 故障专项验收
| 用例 | 操作步骤 | 预期结果 |
|---|---|---|
| MINIO-01 | 暂停 MinIO 容器后上传数据集 | 页面显示明确存储不可用,不显示上传成功 |
| MINIO-02 | MinIO 暂停期间预检训练 | 预检提示对象不可用,可重试 |
| MINIO-03 | MinIO 恢复后重试任务 | 对象可重新准备,任务继续或重新提交成功 |
| MINIO-04 | 删除用户后执行对象清理 | 用户资源对象标记 deleted清理成功后标记 purged |
| MINIO-05 | 清理时对象删除失败 | storage cleanup job 保留 failed 状态和错误原因,后续可重试 |
## 9. 离线部署验收
| 用例 | 操作步骤 | 预期结果 |
|---|---|---|
| OFFLINE-01 | 检查 `docker/offline/src/backend/app/db/sql` | 只存在完整的 `000_full_init.sql` |
| OFFLINE-02 | 清空数据库并执行完整初始化 SQL | 不缺权限相关表和字段Backend 可启动 |
| OFFLINE-03 | 离线启动 Frontend | 不请求在线 CDN页面可正常打开 |
| OFFLINE-04 | 离线启动 Backend、Compute、MinIO | 各服务使用独立网络和配置,权限接口可用 |
| OFFLINE-05 | 离线新库执行用户/租户/ACL/审批流程 | 与主工程行为一致 |
## 10. 问题记录规则
每条失败用例至少记录:
- 测试编号、执行时间、执行人和账号。
- 页面 URL、接口 URL、请求方法和请求 ID。
- 当前用户、租户、资源 ID、资源所属租户。
- 实际 HTTP 状态码、页面提示、数据库状态和容器日志。
- 是否产生了残留 ACL、GPU 分配、配额预留、MinIO 对象或审批记录。
- 修复提交、回归结果和是否需要再次现场验证。
## 11. 当前验收结论
当前已自动验证:前端构建、后端权限安全测试、存储安全测试、数据库字段迁移、容器健康、用户软删除登录拦截和离线源码 SQL 目录结构。
当前前端权限页面已完成主要操作闭环:
- 用户页面权限设置。
- 用户创建时的页面权限配置。
- 租户成员邀请、角色、有效期和配额展示。
- 普通用户访问申请、我的申请和租户邀请接受。
- 资源用户/角色 ACL 管理和全部撤销。
- 审批申请、审批策略可视化配置和中文状态展示。
仍需现场验证:双用户跨租户、多 GPU 并发、第二节点调度、节点失联回收、MinIO 故障注入和完整浏览器点击流。这些属于环境依赖型验收,不代表前端页面缺少入口。