⚠️ 此文件为原始分析档案 — 内容已被 docs/ 下结构化章节覆盖。详见 docs/protocol/README.md。
MonkeyCode 授权层级与 API 访问控制矩阵
基于 chaitin/MonkeyCode 开源后端源码逆向分析
分析日期: 2026-05-11
1. 角色体系
1.1 用户角色 (UserRole)
| 角色 |
常量值 |
说明 |
Session Cookie |
| 个人用户 |
individual |
普通注册用户 |
monkeycode_ai_session |
| 企业用户 |
enterprise |
有团队的企业用户 |
monkeycode_ai_session |
| 企业子账户 |
subaccount |
企业下的子账户 |
monkeycode_ai_session |
| 系统管理员 |
admin |
MonkeyCode AI 管理员,配置公共资源 |
monkeycode_ai_session |
| Git 任务用户 |
gittask |
全自动 git 任务专用用户 |
内部使用 |
1.2 用户状态 (UserStatus)
| 状态 |
常量值 |
说明 |
对账号池的影响 |
| 正常 |
active |
可正常使用 |
可用 |
| 未激活 |
inactive |
未完成激活流程 |
不可用 |
| 被封禁 |
banded |
被管理员封禁 |
需从池中移除 |
1.3 团队成员角色 (TeamMemberRole)
| 角色 |
说明 |
Session Cookie |
| 团队管理员 |
team_admin |
管理团队资源、成员 |
| 团队成员 |
team_member |
使用团队资源 |
1.4 资源所有者类型 (OwnerType)
| 类型 |
常量值 |
说明 |
可见性 |
| 私有 |
private |
用户个人创建 |
仅创建者 |
| 团队 |
team |
团队共享 |
团队内成员 |
| 公开 |
public |
管理员创建 |
所有认证用户 |
1.5 模型访问级别 (AccessLevel)
| 级别 |
说明 |
可用模型 |
basic |
基础订阅 |
免费模型 + basic 模型(如 monkeycode-basic/qwen3.5-plus) |
pro |
专业订阅 |
basic 模型 + pro 模型(如 monkeycode-pro/kimi-k2.6) |
ultra |
高级订阅 |
所有模型(含 monkeycode-ultra/gpt-5.5) |
2. 认证中间件体系
2.1 中间件类型
| 中间件 |
方法 |
行为 |
使用场景 |
Auth() |
强制认证 |
未登录返回 401 |
大部分用户 API |
Check() |
可选认证 |
未登录继续,context 无用户 |
公开流、可选认证端点 |
TeamAuth() |
强制团队认证 |
未登录或无团队返回 401 |
团队管理 API |
TeamAuthCheck() |
可选团队认证 |
未登录返回 401,无团队返回 401 |
团队可选端点 |
TeamAdminAuth() |
团队管理员授权 |
需 TeamAuth + admin 权限 |
团队管理操作 |
2.2 认证检查流程
请求到达
↓
读取 Cookie (monkeycode_ai_session 或 monkeycode_ai_team_session)
↓
Cookie 不存在 →
Auth() → HTTP 401 "Unauthorized"
Check() → 继续,context 无用户
↓
Cookie 存在 → session.Get() 从 Redis 读取
↓
读取失败 →
Auth() → HTTP 401 "Unauthorized"
Check() → 继续,context 无用户
↓
读取成功 → 注入 User/TeamUser 到 context
↓
TeamAuth 额外检查 → user.Team == nil → HTTP 401 "User has no team"
TeamAdminAuth 额外检查 → isAdmin() == false → HTTP 403 "Forbidden"
2.3 活跃追踪中间件 (TargetActive)
每个需要认证的请求还会经过 TargetActive() 中间件:
- 记录用户活跃时间到 Redis (monkeycode_ai:user:active)
- 记录用户活跃 IP
- 用于统计和空闲检测
3. API 访问控制矩阵
3.1 公开端点(无需认证)
| Method |
Path |
说明 |
| GET |
/api/v1/users/login |
百智云 OAuth 跳转 |
| POST |
/api/v1/teams/users/login |
团队管理员登录 |
| POST |
/api/v1/users/password-login |
用户密码登录 |
| POST |
/api/v1/public/captcha/challenge |
获取验证码 |
| POST |
/api/v1/public/captcha/redeem |
兑换验证码 |
| GET |
/api/v1/users/models/providers |
获取供应商模型列表 |
| PUT |
/api/v1/users/passwords/reset-request |
请求重置密码 |
| GET |
/api/v1/users/passwords/accounts/{token} |
获取重置账号信息 |
| PUT |
/api/v1/users/passwords/reset |
重置密码 |
3.2 用户级端点(需要 monkeycode_ai_session)
核心 LLM 相关:
| Method |
Path |
中间件 |
说明 |
| GET |
/api/v1/users/models |
Auth + TargetActive |
列出可用模型 |
| POST |
/api/v1/users/models |
Auth + TargetActive |
创建模型 |
| PUT |
/api/v1/users/models/{id} |
Auth + TargetActive |
更新模型 |
| DELETE |
/api/v1/users/models/{id} |
Auth + TargetActive |
删除模型 |
| GET |
/api/v1/users/models/{id}/health-check |
Auth + TargetActive |
模型健康检查 |
| POST |
/api/v1/users/models/health-check |
Auth + TargetActive |
按配置检查 |
| POST |
/api/v1/users/tasks |
Auth + TargetActive |
创建任务 |
| GET |
/api/v1/users/tasks |
Auth + TargetActive |
列出任务 |
| GET |
/api/v1/users/tasks/{id} |
Auth + TargetActive |
任务详情 |
| DELETE |
/api/v1/users/tasks/{id} |
Auth + TargetActive |
删除任务 |
| PUT |
/api/v1/users/tasks/{id} |
Auth + TargetActive |
更新任务 |
| PUT |
/api/v1/users/tasks/stop |
Auth + TargetActive |
停止任务 |
| GET |
/api/v1/users/tasks/stream |
Auth + TargetActive |
任务流 WebSocket |
| GET |
/api/v1/users/tasks/control |
Auth + TargetActive |
任务控制 WebSocket |
| GET |
/api/v1/users/tasks/rounds |
Auth + TargetActive |
历史轮次 |
| GET |
/api/v1/users/tasks/public-stream |
Check |
公开任务流 |
用户信息:
| Method |
Path |
中间件 |
说明 |
| GET |
/api/v1/users/me |
Auth + TargetActive |
当前用户信息 |
| PUT |
/api/v1/users/profiles |
Auth + TargetActive |
更新资料 |
| GET |
/api/v1/users/settings |
Auth + TargetActive |
获取设置 |
| PUT |
/api/v1/users/settings |
Auth + TargetActive |
更新设置 |
VM/Host:
| Method |
Path |
中间件 |
说明 |
| POST |
/api/v1/users/hosts/vms |
Auth + TargetActive |
创建 VM |
| GET |
/api/v1/users/hosts/vms |
Auth + TargetActive |
列出 VM |
| DELETE |
/api/v1/users/hosts/vms/{id} |
Auth + TargetActive |
删除 VM |
3.3 团队级端点(需要 monkeycode_ai_team_session)
| Method |
Path |
中间件 |
说明 |
| GET |
/api/v1/teams/models |
TeamAuth |
列出团队模型 |
| POST |
/api/v1/teams/models |
TeamAuth |
创建团队模型 |
| GET |
/api/v1/teams/users |
TeamAuth |
列出团队成员 |
| POST |
/api/v1/teams/users |
TeamAuth + TeamAdminAuth |
添加成员 |
| PUT |
/api/v1/teams/users/{id} |
TeamAuth + TeamAdminAuth |
更新成员 |
| DELETE |
/api/v1/teams/users/{id} |
TeamAuth + TeamAdminAuth |
删除成员 |
3.4 管理员端点(需要 monkeycode_ai_session + admin 角色)
| Method |
Path |
说明 |
| GET |
/api/v1/auth/impersonate |
模拟用户登录 |
| GET |
/api/v1/admin/users |
列出所有用户 |
| GET |
/api/v1/admin/models |
列出所有模型 |
| POST |
/api/v1/admin/models |
创建公开模型 |
4. 资源访问控制规则
4.1 模型访问
用户可见模型 = 用户私有模型 + 团队共享模型 + 公开模型
公开模型 API Key 被隐藏 (HideCredentials)
用户使用公开模型时,后端自动替换 public:model: 前缀为实际 Key
4.2 任务访问
用户只能访问自己创建的任务
Info() 方法检查 task.UserID == user.ID
PublicStream() 方法允许其他用户查看公开任务
4.3 VM 访问
用户只能操作自己的 VM
团队管理员可查看团队 VM
公共主机 (public_host) 对所有用户可用
5. 账号池权限边界
5.1 个人用户账号池
| 可访问 |
不可访问 |
| 用户模型 CRUD |
团队模型管理 |
| 任务全生命周期 |
团队成员管理 |
| VM 创建/删除 |
管理员操作 |
| 对话/消息 |
Impersonate |
| 公开模型使用 |
公开模型配置 |
5.2 团队管理员账号池
| 可访问 |
不可访问 |
| 团队模型 CRUD |
管理员操作 |
| 团队成员管理 |
Impersonate |
| 团队分组管理 |
其他团队 |
| 团队 Host/VM |
|
5.3 推荐账号池角色
对于 LLM 反向代理场景,推荐使用个人用户账号:
- 需要的核心 API:模型列表 + 任务创建/流/控制
- 这些 API 全部在用户级端点下
- 团队级 API 不需要
- 管理员级 API 不需要(除非要创建公开模型)