运行治理约 12 分钟
管理面与身份中心
谁能登录、谁能管哪些实例:身份中心签发令牌,管理面做实例、角色权限、配额和审批;企业已有的登录体系通过身份联邦接进来。
依据 agent-runtime develop@0a47a523(2026-11-12)核实
管理面有三块
applications/manager 是一个完整的管理平面:
| 子模块 | 做什么 | 默认端口 |
|---|---|---|
identity_center | 认证中心:OAuth2 / JWT、用户与组织 | 8770 |
manager_server | 管理 API:实例、模板等,外加一个 WebSocket | 8765 / 8766 |
manager_web | 管理面前端(React + Vite) | 5273 |
启动顺序是先身份中心、再管理 API、最后前端。默认用 SQLite,开箱就能在本地跑。
说明
这个管理面最初是为一个具体产品写的(README 里叫 JiuwenClaw),部分能力和该产品绑定。本关只讲其中通用的设计:身份、权限、配额、审批。
管理 API 里有什么
manager_server/core 下按能力分目录,名字就说明了一个企业级管理面要管的事:
| 目录 | 管什么 |
|---|---|
instance | 智能体实例的创建、状态、数据生命周期 |
template | 实例模板 |
authz | 角色、权限、角色指派与权限解析 |
quota | 团队配额、工作空间配额与用量 |
approval | 审批 |
instance_access | 实例访问控制 |
上一关说过,部署记录上的 user_id / space_id 只是"标签";谁能用哪个空间、能建几个实例,是在这一层用权限和配额来约束的。
身份联邦:接入企业已有的登录
企业通常已经有统一登录(SAML、OIDC 等)。service/auth/federation 定义了一套与协议无关的契约,把"外部系统证明了你是谁"转换成"Runtime 里的本地身份":
客户端 → 宿主的授权流程 → FederationProvider → 企业身份提供方
→ 验证通过的 ExternalIdentity
→ FederationCoordinator → FederatedIdentityStore
→ LocalPrincipal → 宿主签发内部令牌 → 业务 Handler
源码身份联邦契约agent-runtime/service/openjiuwen_runtime/service/auth/federation/README.md@0a47a523
几条安全规则值得照抄到自己的设计里:
- 稳定身份键是 (连接 ID, 签发方, 外部主体标识),不能用邮箱或显示名
- 先验回调,再建身份:两步之间宿主必须确认授权请求真实、一次性、未过期
- 连接绑定了组织,返回的本地身份不属于该组织会被拒绝;连接或签发方"漂移"也会被拒绝
- 并发的首次登录只能创建一个本地用户,由存储层用唯一约束或事务保证
- 真实的 SAML 实现至少要验签名和证书、Issuer、Audience、时间窗口和防重放
联邦包刻意不做的事:创建授权码和令牌、解析 HTTP、保存防重放状态、建用户表、把企业部门自动映射成分组。这些由身份中心或应用适配器实现。README 也坦白:仓库里没有真实的企业身份提供方,正式接口靠假实现的单元测试验证。
小结
- 管理面 = 身份中心 + 管理 API + 前端;权限、配额、审批都在管理 API 里。
- 租户字段只是标签,真正的隔离靠这里的身份和权限。
- 接企业统一登录用身份联邦,稳定身份键和"先验后建"是两条关键规则。
源码出处
- agent-runtime/applications/manager/README.md管理面的三个子模块
- agent-runtime/service/openjiuwen_runtime/service/auth/federation/README.md身份联邦的契约与安全要求
- agent-runtime/service/openjiuwen_runtime/service/auth/federation/coordinator.py:21
class FederationCoordinator联邦编排:先验回调,再建本地身份 - agent-runtime/service/openjiuwen_runtime/service/auth/federation/domain.py:36
class LocalPrincipal本地身份 - agent-runtime/applications/manager/manager_server/src/manager_server/core/authz/service.py角色、权限、指派
- agent-runtime/applications/manager/manager_server/src/manager_server/core/quota/workspace_quota_policy.py:257
class WorkspaceQuotaPolicyService工作空间配额
链接指向固定提交,仓库后续更新不影响这里的行号。
过关测验
1. 身份联邦里,用什么作为一个外部用户的稳定身份键?
2. FederationCoordinator 为什么把"验证回调"和"创建本地身份"拆成两步?
3. 联邦包会替你创建 OAuth2 授权码和令牌吗?