人/Agent/工具三元鉴权体系:基于 OAuth2 Scopes 的细粒度权限管控
在智能体(Agent)系统进入企业级多租户与核心生产权限管理时,传统的基于“人类用户登录(User Auth)”的身份认证体系暴露出严重的权限模型塌陷:
- 场景 A(代客越权):一个普通前台员工通过对话提示词诱导 Agent:“帮我查一下全公司所有高管的薪资明细”;如果 Agent 内部配置了具有全量数据库访问权的超级只读账号,Agent 可能会代替该普通员工调用工具查出敏感数据,造成严重的**“身份混淆与越权攻击(Confused Deputy Problem)”**;
- 场景 B(工具滥用):Agent 被恶意 Prompt 注入劫持后,试图调用
delete_database_cluster高危运维工具;如果工具本身缺乏对“调用方是否为受信任 Agent 实例”的身份核验,直接放行将引发灾难性后果。
传统的“用户登录拿 JWT”无法解决智能体时代的复杂权限流转。
必须构建涵盖**“人类发起者(Human User) + 代理智能体(Autonomous Agent) + 底层执行工具(Execution Tool)”的“人/Agent/工具三元鉴权体系(User-Agent-Tool Tripartite Authorization)”**,并基于标准的OAuth2 Scopes 与细粒度权限委托机制,实现权限的物理级最小化约束。
一、人/Agent/工具三元鉴权交叉验证模型
┌────────────────────────────────────────────────────────────────────────┐ │ 1. 终端人类发起者 (Human Subject): 拥有基础角色权限 (User Scopes) │ │ 范例: [user:read_own_orders], 绝对无权访问其他人的订单 │ ├────────────────────────────────────────────────────────────────────────┤ │ 2. 智能体中枢 (Agent Delegate): 拥有受限的代理能力权限 (Agent Scopes) │ │ 范例: [agent:query_db_readonly], 严禁执行任何写操作 │ ├────────────────────────────────────────────────────────────────────────┤ │ 3. 目标外部工具 (Target Tool / Resource): 声明自身所需的执行权限 (Required) │ │ 范例: execute_refund 必须要求 [payment:write_refund] 权限 │ └────────────────────────────────────────────────────────────────────────┘[ 最终执行权限判定 = User_Scopes ∩ Agent_Scopes ∩ Tool_Allowlist ] 【交集授权原则(Intersection Principle)】: 智能体在代人类执行某个 Tool 时,其最终生效的权限取“人类自身权限”与“Agent自身权限”的【最小严格交集】! 哪怕 Agent 是超级管理员,只要发起请求的人类没有退款权限,该工具调用必然被 100% 物理拦截!二、基于 OAuth2 Scopes 的三元令牌(Tripartite Token)Schema
网关层生成的统一授权上下文字典:
{ "iss": "https://auth.enterprise.internal", "sub": "usr_998124_zhangsan", "user_metadata": { "role": "CS_TIER_1", "scopes": ["orders:read", "logistics:read", "coupons:issue_low_value"] }, "act": { "sub": "agent_cs_assistant_v2", "agent_type": "CUSTOMER_SERVICE_ROUTER", "delegated_scopes": ["orders:read", "logistics:read", "database:query_read"] }, "aud": "https://tools.gateway.internal", "exp": 1788700800 }三、生产级 Python 三元鉴权拦截器实现
from typing import List, Dict, Any, Set from pydantic import BaseModel import jwt class AuthorizationContext(BaseModel): user_id: str user_scopes: Set[str] agent_id: str agent_scopes: Set[str] class TripartiteToolAuthorizer: def __init__(self, tool_registry): self.registry = tool_registry def authorize_and_execute( self, auth_context: AuthorizationContext, tool_name: str, tool_args: dict, actual_invoker_fn ) -> Any: tool_meta = self.registry.get_metadata(tool_name) required_scope = tool_meta.required_scope # 1. 规则 1:核验发起该请求的人类用户是否具备该 Scope 权限 if required_scope not in auth_context.user_scopes: print(f"【越权拦截 🛑】用户 [{auth_context.user_id}] 缺乏必要权限 [{required_scope}],无法授权 Agent 执行工具 [{tool_name}]!") return { "status": "PERMISSION_DENIED_USER", "error": f"您当前的账号角色无权执行操作: {tool_name},请联系管理员升级权限。" } # 2. 规则 2:核验当前 Agent 实例是否被授权代理该 Scope if required_scope not in auth_context.agent_scopes: print(f"【智能体越权拦截 🚨】Agent [{auth_context.agent_id}] 未被授予代理权限 [{required_scope}],拒绝执行!") return { "status": "PERMISSION_DENIED_AGENT", "error": f"当前智能体实例未被授予调用 [{tool_name}] 的代理权限。" } # 3. 规则 3:数据行级多租户隔离约束 (Row-Level Security) if "user_id" in tool_args and tool_args["user_id"] != auth_context.user_id: # 强制覆盖为当前真实已认证的用户 ID,彻底杜绝参数篡改越权! print(f"【参数安全修正】将入参 user_id 强制重置为已认证用户 ID: {auth_context.user_id}") tool_args["user_id"] = auth_context.user_id # 4. 权限核验全量通过,放行执行 print(f"【鉴权通过 ✅】用户与 Agent 权限交集核验成功,放行工具: {tool_name}") return actual_invoker_fn(tool_args)四、生产治理铁律
在智能体权限工程中,必须死守三条红线:
- 彻底杜绝全局万能 Service Account:严禁给智能体配置具有“全表查询”或“免密扣款”的后台超级权限账号,所有工具调用必须严格绑定具体人类的上下文令牌;
- 入参敏感字段强制服务端覆盖(Server-Side Overwrite):对于
user_id、tenant_id、account_id等核心鉴权字段,绝不允许完全信任大模型提取的值,必须强制由网关层从 JWT 令牌中提取并覆盖; - 短期令牌与动态刷新:Agent 代理令牌(Delegated Token)有效期严格限制在 15 分钟以内,随会话销毁而立即作废。
把权限的锁链精确套牢在人类、智能体与底层工具的三元交叉点上,才能在彻底杜绝越权与数据泄露的前提下,让智能体在安全的轨道上自由释放自动化能力。