平台权限设计文档
版本:v1.0
日期:2026-08-02
状态:设计基线,供后端实现和前端联调参照
目录
- 设计目标
- 整体架构
- 角色体系
- 页面权限码
- 资源所有权与可见性
- 资源级 ACL(访问控制列表)
- GPU 算力分配与隔离
- 审批拦截机制
- 审计日志
- 接口鉴权流程
- 数据库表结构
- API 接口清单
- 前端权限控制
- 安全设计补充
- 实施计划
1. 设计目标
| 目标 |
说明 |
| 数据隔离 |
用户自己创建的数据集、模型、训练任务默认只有自己可见可操作;管理员可见全部 |
| 权限分层 |
页面级(菜单/路由可见性)+ 资源级(单条数据的读/写/删)两层控制 |
| GPU 管控 |
多卡服务器上,管理员可指定哪些用户能使用哪些 GPU 卡 |
| 审批拦截 |
删除他人资源、停止他人任务、发布模型等高风险操作需审批或管理员旁路 |
| 审计可追溯 |
所有写操作和敏感操作产生审计日志,可按用户、动作、资源、时间筛选 |
| 权限最小变更 |
只有管理员可修改用户角色和权限码;普通用户无法提权 |
2. 整体架构
鉴权链路:
- 请求到达 →
get_current_user 从 Authorization: Bearer platform-token-{user_id} 解析当前用户
- 页面级权限 → 检查
user.permissions 是否包含路由对应的权限码
- 资源级权限 → 检查资源的
created_by 字段(所有权)或 acls 表(ACL 授权)
- GPU 权限 → 检查
gpu_assignments 表确认用户是否被分配了请求的 GPU
3. 角色体系
3.1 内置角色
| 角色 code |
中文名 |
说明 |
admin |
超级管理员 |
拥有全部权限码;可见全部资源;可管理用户和 GPU 分配 |
operator |
操作员 |
可创建/操作自己的数据集、模型、训练任务;不可管理用户 |
viewer |
观察员 |
只读权限;可查看被授权的资源;不可创建或修改 |
guest |
访客 |
仅登录和看板;无业务操作权限(扩展预留) |
3.2 角色与权限码映射
| 权限码 |
admin |
operator |
viewer |
dashboard |
✅ |
✅ |
✅ |
fine-tune |
✅ |
✅ |
— |
model-eval |
✅ |
✅ |
— |
model-inference |
✅ |
✅ |
— |
model-manage |
✅ |
✅ |
— |
dataset |
✅ |
✅ |
— |
data-process |
✅ |
✅ |
— |
data-convert |
✅ |
✅ |
— |
compute |
✅ |
✅ |
— |
hardware |
✅ |
✅ |
✅ |
logs |
✅ |
✅ |
✅ |
user-settings |
✅ |
— |
— |
3.3 权限修改规则
- 只有 admin 角色的用户可以修改其他用户的角色和权限码
- admin 用户的
protected=True 标记,防止被删除或降级
- 权限修改操作产生审计日志:
action=user.permission.update
- 用户可以查看自己的权限,不能修改自己的权限
4. 页面权限码
| 权限码 |
对应路由 |
功能 |
dashboard |
/dashboard |
服务看板 |
fine-tune |
/fine-tune, /fine-tune/create, /training-log/:id |
模型训练 |
model-eval |
/model-eval, /model-eval/create, /model-eval/:id |
模型评测 |
model-inference |
/model-inference, /model-inference/create, /model-inference/chat/:id |
模型推理 |
model-manage |
/model-manage, /model-manage/create, /model-manage/:id/edit, /model-manage/merge |
模型管理 |
dataset |
/dataset, /dataset/create, /dataset/:id/preview |
数据集管理 |
data-process |
/data-process, /data-process/create, /data-process/:id |
数据处理 |
data-convert |
/data-convert, /tools |
数据转换与工具 |
compute |
/compute |
算力节点 |
hardware |
/hardware |
平台性能 |
logs |
/logs, /training-log/:id |
查看日志 |
user-settings |
/user-settings, /tenants, /projects, /approvals, /audit-logs |
系统设置与平台治理 |
5. 资源所有权与可见性
5.1 所有权模型
每个用户可创建的资源都携带 created_by(或 owner_id)字段,标识资源所有者。
| 资源类型 |
表 |
所有者字段 |
说明 |
| 数据集 |
datasets |
created_by |
用户上传/创建的数据集 |
| 基座模型 |
models |
created_by |
登记的本地/API 模型 |
| 训练产物 |
trained_models |
created_by |
微调产出的模型 |
| 训练任务 |
fine_tune_tasks |
payload.created_by |
微调任务 |
| 评测任务 |
eval_tasks |
created_by |
评测任务 |
| 推理任务 |
compare_tasks (payload) |
created_by |
推理/对比任务 |
| 数据处理任务 |
data_process_tasks |
created_by |
数据处理任务 |
| 数据转换任务 |
data_convert_jobs |
created_by |
数据转换任务 |
5.2 可见性规则
5.3 所有权操作矩阵
| 操作 |
admin |
资源所有者 |
其他被授权用户 |
其他用户 |
| 查看资源 |
✅ 全部 |
✅ 自己的 |
✅ ACL 授权范围内 |
❌ |
| 编辑资源 |
✅ |
✅ 自己的 |
✅ ACL 含 write 时 |
❌ |
| 删除资源 |
✅ |
✅ 自己的(需审批) |
❌ |
❌ |
| 分享/授权 |
✅ |
✅ 自己的 |
❌ |
❌ |
| 使用资源(训练/推理/评测) |
✅ |
✅ 自己的 |
✅ ACL 含 execute 时 |
❌ |
5.4 数据集可见性示例
6. 资源级 ACL(访问控制列表)
6.1 ACL 表结构
6.2 权限粒度
| 权限值 |
含义 |
覆盖关系 |
read |
查看资源详情、列表 |
— |
write |
编辑资源内容/元数据 |
覆盖 read |
execute |
使用资源(如用数据集训练、用模型推理) |
覆盖 read |
download |
下载资源文件 |
独立权限 |
delete |
删除资源 |
独立权限(通常需审批) |
admin |
完全控制(含 ACL 管理) |
覆盖以上全部 |
6.3 ACL 管理接口
| 接口 |
方法 |
权限要求 |
说明 |
/resources/{type}/{id}/acl |
GET |
admin 或资源所有者 |
查询资源 ACL |
/resources/{type}/{id}/acl |
PUT |
admin 或资源所有者 |
设置资源 ACL(全量替换) |
6.4 ACL 管理规则
- admin 可以在任何资源上设置 ACL
- 资源所有者 可以在自己的资源上设置 ACL
- 被授权用户 不能转授自己获得的权限
- ACL 变更产生审计日志:
action=resource.acl.set
- 设置 ACL 时全量替换该资源的所有 ACL 条目
6.5 前端 ACL 管理入口
在数据集详情、模型详情、训练任务详情页面提供「资源授权」按钮,弹出 ACL 管理对话框:
- 显示当前 ACL 列表(主体类型 + 主体名称 + 权限勾选)
- 支持按用户或按角色添加授权
- 权限以多选框形式展示(read / write / execute / download / delete)
7. GPU 算力分配与隔离
7.1 设计背景
服务器可能安装多张 GPU 卡(如 8×A100),需要精细化管控:
- 管理员指定哪些用户可以使用哪些 GPU 卡
- 未被分配的 GPU 卡对用户不可见或不可选
- admin 可以使用全部 GPU
7.2 GPU 分配表
7.3 分配规则
| 规则 |
说明 |
| 谁可分配 |
只有 admin 角色可以分配 GPU |
| admin 使用 |
admin 可使用全部 GPU,不需要显式分配 |
| 普通用户 |
只能使用 gpu_assignments 中分配给自己的 GPU |
| 共享分配 |
一张 GPU 可分配给多个用户(非独占),但同时只能被一个任务占用 |
| 默认策略 |
新用户默认不分配任何 GPU,由管理员显式分配 |
7.4 GPU 分配接口
| 接口 |
方法 |
权限 |
说明 |
/compute/gpu-assignments |
GET |
admin |
查看全部分配关系 |
/compute/gpu-assignments |
POST |
admin |
批量分配(body: { assignments: [{ node_id, gpu_index, user_id }] }) |
/compute/gpu-assignments/{id} |
DELETE |
admin |
撤销某条分配 |
/compute/my-gpus |
GET |
登录用户 |
查看自己可用的 GPU 列表 |
7.5 训练/评测/推理 GPU 选择校验
当普通用户创建训练任务、评测任务、推理任务并选择 GPU 时:
- 后端检查
gpu_assignments 表,确认用户被分配了所选 GPU
- 未被分配的 GPU → 返回 403
"无权使用 GPU {node}:{index}"
- admin 用户跳过此校验
7.6 前端 GPU 选择交互
- 普通用户在创建任务选择 GPU 时,下拉列表只显示自己被分配的 GPU
- admin 用户在下拉列表中可看到全部 GPU
- 未分配任何 GPU 的用户,GPU 选择区域显示提示:"未分配 GPU,请联系管理员"
8. 审批拦截机制
8.1 需要审批的操作
| 操作 |
触发条件 |
审批动作 code |
| 删除他人数据集 |
非 admin 删除 created_by != user.id 的数据集 |
dataset.delete |
| 删除他人模型 |
非 admin 删除 created_by != user.id 的模型 |
model.delete |
| 停止他人训练任务 |
非 admin 停止 created_by != user.id 的任务 |
fine_tune.stop |
| 发布模型到推理服务 |
任何用户(含 admin)发布到生产环境 |
model_service.publish |
| 删除项目空间 |
存在待审批变更时拒绝 |
project.delete |
| 归档项目空间 |
存在待审批变更时拒绝 |
project.archive |
| 导出训练产物 |
非 admin 导出他人训练的模型 |
trained_model.export |
8.2 审批流程
8.3 审批模板
审批模板定义了特定操作需要几步审批、每步的审批人是谁:
8.4 审批拦截点
在项目模块的 _require_no_pending_approval 函数中,当存在待审批实例时拒绝执行新操作。其他模块通过 _require_approval_or_admin 函数实现 admin 旁路或创建审批实例。
9. 审计日志
9.1 审计范围
所有写操作和敏感操作必须产生审计日志:
| 动作分类 |
action 示例 |
| 用户管理 |
user.create, user.update, user.delete, user.permission.update |
| 租户管理 |
tenant.create, tenant.update, tenant.quota.set, tenant.retention.set |
| 项目管理 |
project.create, project.update, project.archive, project.delete, project.member.add, project.member.update, project.member.remove |
| 资源 ACL |
resource.acl.set |
| 模型管理 |
model.create, model.update, model.delete, model.merge |
| 数据集 |
dataset.create, dataset.update, dataset.delete, dataset.upload |
| 训练任务 |
fine_tune.create, fine_tune.start, fine_tune.stop, fine_tune.delete |
| 评测任务 |
eval.create, eval.start, eval.stop |
| 推理任务 |
inference.create, inference.start, inference.stop |
| 审批 |
approval.create, approval.decide |
| 留存策略 |
retention.create, retention.update, retention.delete |
| GPU 分配 |
gpu.assign, gpu.unassign |
9.2 审计日志字段
9.3 查询与导出
| 接口 |
方法 |
说明 |
/system/audit-logs |
GET |
分页查询,支持按 tenant_id / project_id / actor_id / action / target_type / start_time / end_time 筛选 |
/system/audit-logs/export |
GET |
CSV 导出,与应用查询相同的过滤条件 |
10. 接口鉴权流程
10.1 Token 格式
登录成功后返回 token 和 user 信息。Token 中编码了 user_id,后端通过 get_current_user 解析。
10.2 鉴权层级
10.3 FastAPI 依赖注入
11. 数据库表结构
11.1 现有表(已实现)
| 表名 |
用途 |
users |
用户表(id, username, password_hash, role, status, permissions, protected) |
roles |
角色定义(name, permissions) |
sessions |
登录会话(user_id, issued_at, expires_at, ip) |
acls |
资源访问控制列表(resource_type, resource_id, principal_type, principal_id, permission) |
audit_logs |
审计日志(actor_id, action, target_type, target_id, time) |
datasets |
数据集(需补充 created_by 字段) |
models |
基座模型(需补充 created_by 字段) |
trained_models |
训练产物(需补充 created_by 字段) |
fine_tune_tasks |
训练任务(payload 中存储 created_by) |
gpus |
GPU 设备(node_id, gpu_index, uuid, name, memory) |
compute_nodes |
算力节点 |
tenants |
租户 |
projects |
项目空间 |
project_members |
项目成员 |
approval_templates |
审批模板 |
approval_instances |
审批实例 |
retention_policies |
留存策略 |
11.2 需新增/补充的表和字段
新增 gpu_assignments 表
补充 created_by 字段
12. API 接口清单
12.1 鉴权接口
| 接口 |
方法 |
鉴权 |
说明 |
/modelTF/login |
POST |
公开 |
登录,返回 token + user |
/modelTF/me |
GET |
Bearer token |
获取当前用户信息 |
/modelTF/users |
GET |
admin |
用户列表 |
/modelTF/users |
POST |
admin |
创建用户 |
/modelTF/users/:id |
PUT |
admin |
更新用户(角色/状态/权限) |
/modelTF/users/:id |
DELETE |
admin |
删除用户(protected 用户不可删) |
/modelTF/users/:id/reset-password |
POST |
admin |
重置密码 |
/modelTF/system/permissions/codes |
GET |
登录 |
权限码清单 |
/modelTF/system/permissions |
GET |
登录 |
权限码 + 角色定义 |
12.2 资源 ACL 接口
| 接口 |
方法 |
鉴权 |
说明 |
/modelTF/resources/:type/:id/acl |
GET |
admin 或所有者 |
查询资源 ACL |
/modelTF/resources/:type/:id/acl |
PUT |
admin 或所有者 |
设置资源 ACL |
12.3 GPU 分配接口
| 接口 |
方法 |
鉴权 |
说明 |
/modelTF/compute/gpu-assignments |
GET |
admin |
查看全部分配 |
/modelTF/compute/gpu-assignments |
POST |
admin |
批量分配 |
/modelTF/compute/gpu-assignments/:id |
DELETE |
admin |
撤销分配 |
/modelTF/compute/my-gpus |
GET |
登录 |
查看自己可用 GPU |
12.4 审批接口
| 接口 |
方法 |
鉴权 |
说明 |
/modelTF/approvals/templates |
GET/POST |
admin |
审批模板列表/创建 |
/modelTF/approvals |
GET/POST |
登录 |
审批实例列表/创建 |
/modelTF/approvals/:id |
GET |
登录 |
审批实例详情 |
/modelTF/approvals/:id/steps/:idx/decision |
POST |
审批人 |
审批决策 |
12.5 审计接口
| 接口 |
方法 |
鉴权 |
说明 |
/modelTF/system/audit-logs |
GET |
admin |
审计日志分页查询 |
/modelTF/system/audit-logs/export |
GET |
admin |
CSV 导出 |
12.6 租户/项目接口
| 接口 |
方法 |
鉴权 |
说明 |
/modelTF/tenants |
GET/POST |
admin |
租户列表/创建 |
/modelTF/tenants/:id |
GET/PUT |
admin |
租户详情/更新 |
/modelTF/tenants/:id/quota |
PUT |
admin |
设置配额 |
/modelTF/tenants/:id/retention-policy |
PUT |
admin |
绑定留存策略 |
/modelTF/projects |
GET/POST |
登录 |
项目列表/创建 |
/modelTF/projects/:id |
GET/PUT |
登录 |
项目详情/更新 |
/modelTF/projects/:id/archive |
POST |
admin 或所有者 |
归档(审批拦截) |
/modelTF/projects/:id/members |
GET/POST |
登录 |
成员列表/添加 |
/modelTF/projects/:id/members/:uid |
PUT/DELETE |
admin 或所有者 |
改角色/移除 |
12.7 留存策略接口
| 接口 |
方法 |
鉴权 |
说明 |
/modelTF/retention-policies |
GET/POST |
admin |
策略列表/创建 |
/modelTF/retention-policies/:id |
GET/PUT/DELETE |
admin |
策略详情/更新/删除 |
13. 前端权限控制
13.1 路由守卫
13.2 侧边栏过滤
13.3 资源级按钮控制
13.4 GPU 选择过滤
14. 安全设计补充
14.1 密码安全
- 密码使用 PBKDF2-SHA256 存储(salt + 390000 次迭代)
- 旧系统明文密码在首次登录时自动升级为哈希
- 管理员可重置用户密码,用户不可自行修改密码(本期设计)
- 默认密码:
platform123(创建用户时由管理员设定)
14.2 会话安全
| 规则 |
说明 |
| Token 格式 |
platform-token-{user_id} |
| 会话超时 |
默认 30 分钟无操作自动过期 |
| 并发会话 |
同一用户可有多会话,各自独立计时 |
| 会话续期 |
前端定时调用 auth.refresh() 续期 |
| 强制下线 |
admin 可通过修改用户 status=disabled 使其 token 失效 |
14.3 操作限流
| 接口 |
限制 |
/login |
同一 IP 5 次/分钟,失败后 30 秒冷却 |
| 文件上传 |
单文件最大由配置控制,默认 2GB |
| 训练任务创建 |
同一用户并发运行任务数受 GPU 分配限制 |
14.4 数据安全
| 规则 |
说明 |
| 软删除 |
数据集、模型、任务使用 deleted_at 标记,保留审计可追溯 |
| 敏感字段 |
API 密钥(api_key)在列表接口不返回明文 |
| 下载审计 |
数据集下载产生审计日志,记录下载人和时间 |
| 导出审计 |
训练产物导出产生审计日志 |
14.5 多租户隔离
| 规则 |
说明 |
| 租户隔离 |
同一租户内的资源相互可见;跨租户默认不可见 |
| 项目隔离 |
项目内资源受项目 ACL 控制;项目间默认不可见 |
| admin 旁路 |
admin 可跨租户/项目访问全部资源 |
| 配额管控 |
租户级配额限制 GPU 并发数、存储容量、最大项目数 |
15. 实施计划
15.1 已实现
| 功能 |
状态 |
| 登录/会话/Token |
✅ 已实现 |
| 用户 CRUD + 权限码 |
✅ 已实现 |
| 角色定义 |
✅ 已实现 |
| 资源 ACL(acls 表 + 接口) |
✅ 已实现 |
| 审计日志(查询 + 导出) |
✅ 已实现 |
| 审批模板/实例 |
✅ 已实现 |
| 项目空间 + 成员 |
✅ 已实现 |
| 租户 + 配额 + 留存 |
✅ 已实现 |
| 审批拦截(项目归档/删除) |
✅ 已实现 |
| 资源所有权 ACL 字段适配(subject_type/permissions[]) |
✅ 已实现 |
15.2 待实现
| 功能 |
优先级 |
涉及表/接口 |
| GPU 分配表 + 接口 |
P0 |
gpu_assignments 表 + /compute/gpu-assignments + /compute/my-gpus |
资源 created_by 字段补充 |
P0 |
datasets / models / trained_models / eval_tasks 表 ALTER |
资源列表按 created_by + ACL 过滤 |
P0 |
platform_store.py 中 datasets/models/tasks 列表方法 |
| GPU 选择校验(训练/评测/推理创建时) |
P0 |
platform.py 中 create_task/eval/inference |
| 前端 GPU 下拉过滤 |
P1 |
前端创建任务页面 |
| 前端资源授权按钮 |
P1 |
前端数据集/模型/任务详情页 |
| 前端权限管理页面优化 |
P1 |
前端用户设置页面 |
| 审批拦截扩展(删除数据集/模型/停止任务) |
P1 |
platform.py 中 delete/stop 接口 |
| 密码安全策略(用户自行修改) |
P2 |
新增 /users/me/password 接口 |
| 操作限流(login 限流) |
P2 |
中间件或 SlowAPI |
| 多租户隔离(按 tenant_id 过滤) |
P2 |
各列表接口增加 tenant_id 过滤 |
15.3 实施步骤
- 数据库迁移:创建
gpu_assignments 表,为资源表补充 created_by 字段
- 后端接口:实现 GPU 分配 CRUD +
my-gpus + 创建任务时的 GPU 权限校验
- 资源过滤:在
datasets() / models() / tasks() 等列表方法中按 created_by + ACL 过滤
- 前端适配:GPU 下拉过滤、资源授权按钮、权限管理页面优化
- 审批扩展:在删除/停止接口中接入
_require_approval_or_admin
- 测试补充:扩展
test_governance.py 覆盖 GPU 分配、资源过滤、审批扩展场景