feat: 平台治理与权限体系完善,存储进度/GPU预留/审批中心与日志整合

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
wuyongtao
2026-08-21 09:49:48 +08:00
parent 080ef6ab00
commit 6f0e82f351
94 changed files with 9547 additions and 1045 deletions

View File

@@ -0,0 +1,227 @@
# 权限验收测试用例
> 版本:权限 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 故障注入和完整浏览器点击流。这些属于环境依赖型验收,不代表前端页面缺少入口。