"""RBAC 权限钩子模块。 提供 AgentScope 智能体的 RBAC(基于角色的访问控制)权限钩子, 在智能体回复前自动注入用户上下文信息(用户ID、角色、部门、数据权限范围)到消息元数据中。 """ from agentscope.agent import AgentBase from agentscope.message import Msg def create_rbac_pre_reply_hook(user_context: dict): """创建 RBAC 预回复钩子函数。 该钩子会在智能体每次回复前执行,将用户的身份信息注入到消息元数据中, 以便后续的工具调用和权限校验能够获取正确的用户上下文。 Args: user_context: 用户上下文信息字典,包含 user_id、role、department_id、data_scope 等字段。 Returns: callable: 异步钩子函数,用于注册到智能体的 pre_reply 钩子点。 """ async def rbac_pre_reply_hook(self: AgentBase, kwargs: dict) -> dict: """RBAC 预回复钩子内部实现。 Args: self: 智能体实例。 kwargs: 传递给智能体 reply 方法的参数字典。 Returns: dict: 修改后的参数字典,消息元数据中已注入用户上下文信息。 """ msg = kwargs.get("msg") if msg and isinstance(msg, Msg): msg.metadata = msg.metadata or {} msg.metadata["_user_id"] = user_context["user_id"] msg.metadata["_role"] = user_context.get("role", "employee") msg.metadata["_department_id"] = user_context.get("department_id", "") msg.metadata["_data_scope"] = user_context.get("data_scope", "self_only") return kwargs return rbac_pre_reply_hook def register_rbac_hooks_for_user(agent: AgentBase, user_context: dict): """为指定智能体注册 RBAC 权限钩子。 将用户上下文信息绑定到智能体的 pre_reply 钩子点, 确保智能体在处理每条消息时都能携带正确的用户身份信息。 Args: agent: 目标智能体实例。 user_context: 用户上下文信息字典。 """ hook = create_rbac_pre_reply_hook(user_context) hook_name = f"rbac_{user_context['user_id']}" agent.register_instance_hook("pre_reply", hook_name, hook)