运行治理约 12 分钟

管理面与身份中心

谁能登录、谁能管哪些实例:身份中心签发令牌,管理面做实例、角色权限、配额和审批;企业已有的登录体系通过身份联邦接进来。

依据 agent-runtime develop@0a47a523(2026-11-12)核实

管理面有三块

applications/manager 是一个完整的管理平面:

子模块做什么默认端口
identity_center认证中心:OAuth2 / JWT、用户与组织8770
manager_server管理 API:实例、模板等,外加一个 WebSocket8765 / 8766
manager_web管理面前端(React + Vite)5273
源码Manager READMEagent-runtime/applications/manager/README.md@0a47a523

启动顺序是先身份中心、再管理 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、时间窗口和防重放
源码FederationCoordinatoragent-runtime/service/openjiuwen_runtime/service/auth/federation/coordinator.py:21@0a47a523

联邦包刻意不做的事:创建授权码和令牌、解析 HTTP、保存防重放状态、建用户表、把企业部门自动映射成分组。这些由身份中心或应用适配器实现。README 也坦白:仓库里没有真实的企业身份提供方,正式接口靠假实现的单元测试验证。

小结

  • 管理面 = 身份中心 + 管理 API + 前端;权限、配额、审批都在管理 API 里。
  • 租户字段只是标签,真正的隔离靠这里的身份和权限。
  • 接企业统一登录用身份联邦,稳定身份键和"先验后建"是两条关键规则。

源码出处

链接指向固定提交,仓库后续更新不影响这里的行号。

过关测验

  1. 1. 身份联邦里,用什么作为一个外部用户的稳定身份键?

  2. 2. FederationCoordinator 为什么把"验证回调"和"创建本地身份"拆成两步?

  3. 3. 联邦包会替你创建 OAuth2 授权码和令牌吗?

通关条件

  • ○ 测验全部答对