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