安全与权限

Chat Access

了解 Chat 用户进入 Agent 前的准入模型

Chat Access

Chat Access 是 Chat Plugin 的准入能力,只回答一个问题:某个外部 Chat 用户的私聊或群聊消息,是否可以进入指定 Agent。

它不是 Agent Core 权限,也不是通用 Role/Permission 系统。用户通过准入后,Chat Plugin 只把消息交给 Agent,不会向 Session 或其他 Plugin 传播角色和权限。

核心规则

  • 默认拒绝:没有明确 allow Grant 时,消息不会进入 Agent。
  • 按 Agent 隔离:访问 Agent A 的批准不会自动允许访问 Agent B。
  • 按 Chat 账号隔离:身份键由 channel + issuer + subject_id 组成,同一用户通过两个 Bot 访问时是两个 Principal。
  • 范围明确:持久化 Grant 只有 directgroup;管理命令中的 all 会展开为两条 Grant。
  • denyrevoke 不同:拒绝后不再生成请求;撤销后用户可以再次请求。

批准流程

未批准用户发送私聊消息时,Chat Plugin 会创建或复用一个 pending Request,并返回类似命令:

city plugin action chat access-approve assistant --input '{"request_id":"req_xxx"}' --token <token>

管理员也可以先查看请求:

city plugin action chat access-snapshot assistant --input '{}' --token <token>

群聊中的未批准消息默认静默拒绝,pending Request 仍会进入同一个管理列表。

数据保存位置

每个 Agent 独立保存:

<agent_project>/.downcity/chat/access.db

Chat Access 数据库包含 Principal、Request、Allow/Deny Grant 和审计事件,不包含 Bot Token、App Secret 或消息正文。Chat Resource 完整 Item 单独加密保存在 City 全局数据库 ~/.downcity/downcity.db,Chat Plugin Binding 只保存 resource_ids

与 City Auth 的区别

Agent Token 负责 HTTP 控制面认证。一个 Token 只属于一个 Agent,并拥有该 Agent API 的完整能力,不包含 User、Role 或 Permission。Chat Access 负责外部 Telegram、飞书或 QQ 用户能否向某个 Agent 发送消息。两者数据、身份和判定路径互不混用。

相关文档