一个 Agent 帮你“查资料”时,权限问题看起来并不复杂;可当它开始替你发邮件、查数据库、修改工单、调用支付接口,问题就变了:它到底是在“代表你”,还是以一个独立系统身份行动?
这不是接口怎么接的问题,而是信任边界怎么划的问题。真正要解决的,是“每一次调用,系统能不能回答:谁发起、凭什么有权、允许做到哪一步、出了问题怎么追责”。
Agent 可以代表用户,但不能等同于用户
最容易犯的错误,是把 Agent 理解成“自动化版用户”。于是用户能做什么,Agent 就能做什么。
假设一名员工有权限查看客户资料、下载报表、审批折扣。Agent 如果完整继承这些权限,那么一次错误理解、提示注入,甚至一段被污染的网页内容,都可能让它执行超出用户原本意图的操作。
更合理的做法,是区分三种身份:用户是谁,Agent 是谁,这次任务又被授权做什么。Agent 可以代表用户发起请求,但请求里应该同时保留用户身份、Agent 身份和任务上下文。
这样系统才能判断:“张三本人有权限”并不等于“张三的 Agent 此刻也有权限”。
不要把“用户权限”直接复制给 Agent
Agent 的权限,应该来自“委托”,而不是继承。
可以把它想成公司里的助理。老板有权签合同,不代表助理拿着老板的工牌,就自动拥有全部签约权限。老板可以委托助理查询合同、整理条款、提交审批,但“最终签署”仍然需要额外授权。
技术上也是一样。用户给 Agent 的不是整套权限,而是一张受限制的委托凭证:限定资源、动作、有效时间,必要时还限定数据范围和金额上限。
例如用户让 Agent“整理今天的销售数据”,它可能只需要读取 CRM 和报表库;即使用户本人有删除客户、修改订单的权限,这些权限也不该进入本次任务。
最小权限原则的关键,是根据任务动态缩小授权范围,而不是给 Agent 一个长期固定角色。
Tool 需要自己的 RBAC,而且最好不止 RBAC
很多系统只在 Agent 层做权限判断:Agent 被允许使用某个 Tool,就默认这个 Tool 内部什么都能做。
这相当于门口查了一次工牌,进楼后所有房间都不锁门。
Tool 应该拥有自己的授权边界。搜索工具可以限制索引范围,数据库工具可以限制库、表甚至字段,工单工具可以把“读取”“创建”“关闭”拆成不同动作。
RBAC 仍然有价值,但复杂 Agent 系统往往还需要更细的策略,例如基于用户、租户、资源、任务目的和风险等级做判断。
一个实用分层是:Agent 决定“调用哪个 Tool”,权限系统决定“这次调用是否允许”,Tool 再决定“允许访问哪些具体资源”。三层都做约束,比只靠 Agent 提示词可靠得多。
Tool Registry 不该只记录“这个工具能做什么”
Tool Registry 往往被设计成工具目录:名称、描述、参数、返回值。但如果 Agent 会自动选工具,这还不够。
Registry 至少应该描述工具的安全属性,例如:需要哪些权限、属于只读还是写操作、风险等级如何、是否需要人工确认、能访问哪些租户或数据域。
这些信息不必成为最终授权的唯一依据,但必须参与决策。否则 Agent 看到“refund_order”只知道它能退款,却不知道这是高风险写操作;看到“query_customer”只知道能查客户,却不知道某些字段属于敏感信息。
工具描述解决“怎么调用”,权限元数据解决“什么时候该调用、谁能调用”。
多租户隔离,不能只靠提示词里的 tenant_id
多租户 Agent 最危险的一类问题,是把租户隔离当成参数问题。
例如让 Agent 调工具时传入 tenant_id,看起来很自然。但如果这个参数来自模型输出,就不能把它当成可信边界。模型写错、被诱导修改,或 Tool 校验不严,都可能造成跨租户访问。
租户身份应该来自可信执行上下文,而不是让 Agent 自己决定。网关、权限服务或 Tool 运行环境应自动注入 tenant_id,并在数据层再次校验。
更稳妥的系统还会让身份凭证、缓存、向量库查询和日志都带明确租户边界。即使 Agent “想”访问另一个租户,它也没有可用凭证。
一套更实用的权限模型
可以把 Agent 调 Tool 的权限判断归纳成四个问题:谁在操作?记录用户和 Agent 身份。为什么操作?绑定当前任务和用户授权意图。能做什么?为每个 Tool 定义动作级权限和资源范围。能做多久?使用短时凭证,并在高风险操作前再次确认。
如果一个系统只能回答“这个用户有没有权限”,它还没有真正进入 Agent 时代。Agent 带来的变化,是权限从“人对系统”变成了“人委托 Agent,再由 Agent 调用多个系统”。
因此最值得坚持的原则是:Agent 可以代表用户,但不应天然拥有用户的全部能力。
设计权限时,不要只问“Agent 需要什么账号”,而要问“这次任务最少需要什么授权”。当身份、委托、Tool 权限、租户边界和审计链条都能被明确表达,Agent 才真正从“能调用工具”走向“可以被放心地委托做事”。




