# RBAC 权限矩阵

后端是唯一权限判定点；前端隐藏菜单和按钮只改善交互，不构成安全边界。

| 权限 | 查看者 | 编辑者 | 管理员 | 典型用途 |
|---|---:|---:|---:|---|
| `governance:read` | 是 | 是 | 是 | 查询治理对象、元数据、数据源、流程和服务 |
| `governance:edit` | 否 | 是 | 是 | 新增、修改和删除治理对象 |
| `review:approve` | 否 | 是 | 是 | 数据审核和治理变更确认 |
| `orders:operate` | 否 | 是 | 是 | 处理数据订单 |
| `workflow:activate` | 否 | 否 | 是 | 激活 DataFlow 对应的 n8n Workflow 版本 |
| `users:manage` | 否 | 否 | 是 | 创建、停用用户、重置密码和分配角色 |

## API 边界

- 公开：`GET /api/system/health`、`POST /api/system/auth/login`。
- 当前身份：`GET /api/system/auth/me`，至少需要查看权限。
- 用户管理：`/api/system/users` 全部需要 `users:manage`。
- 系统配置和诊断：除健康检查外需要管理员权限。
- DataFlow 激活、发布和执行操作需要 `workflow:activate`。
- 数据订单变更需要 `orders:operate`。
- 其余 GET 默认需要 `governance:read`，其余写操作默认需要
  `governance:edit`；无法分类的方法按管理员权限拒绝。

所有已注册 `/api/` 路由由自动化测试逐项验证能够被权限策略分类。缺少或无效
Bearer Token 返回 401；身份有效但权限不足返回 403。禁用用户后，尚未过期的 Token
也会因为服务端实时身份检查失效。

## 身份生命周期

首位管理员只能通过 `python -m app.commands.bootstrap_admin` 显式创建；平台不提供
注册 API。后续账号由管理员创建。密码使用 Argon2id，仅保存哈希；历史 Base64
账号保留在 `users_legacy` 供核查，必须重置密码后才能迁移。系统阻止停用最后一个
有效管理员或移除其管理员角色。
