You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

57 lines
2.2 KiB

"""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)