权限控制
宗主、峰主、弟子三级身份,LLM 自动感知权限边界,越权操作运行时拦截。
身份体系
| 身份 | 权限范围 | 典型操作 |
|---|---|---|
| 宗主 | 全宗门 | 删除修士、管理所有峰 |
| 峰主 | 本峰 | 新增/修改本峰弟子、调整灵石 |
| 弟子 | 仅自己 | 查询自己信息、接任务、兑换功法 |
运行时权限检查
在工具方法内直接检查,使用 XiuxianAgentContext.hasPermission():
java
@Tool(description = "调整修士的灵石或贡献点余额")
public String adjustAssets(..., ToolContext toolContext) {
XiuxianAgentContext ctx = XiuxianAgentContext.fromToolContext(toolContext);
if (ctx != null && !ctx.hasPermission(XiuxianRole.PEAK_MASTER)) {
return error("权限不足:调整资产需要峰主及以上权限");
}
// 执行业务逻辑
}hasPermission() 实现:
java
public boolean hasPermission(XiuxianRole requiredRole) {
return switch (requiredRole) {
case DISCIPLE -> true; // 所有人
case PEAK_MASTER -> role == SECT_MASTER || role == PEAK_MASTER;
case SECT_MASTER -> role == SECT_MASTER; // 仅宗主
};
}双重保障
System Prompt 层
XiuxianAgentService.buildUserInfo() 在 System Prompt 中注入当前用户身份和权限说明:
当前用户身份:**玄清子/宗主**
身份说明:全宗门最高权限
修士姓名:玄清子
境界:金丹期 后期
**权限说明**:
- 可查询全宗门弟子的所有信息(包括敏感信息)
- 可管理全宗门弟子LLM 根据这些信息自然避免越权操作,生成符合身份的回复。
运行时层
即使 LLM 仍尝试越权调用,hasPermission() 在工具执行时拦截。LLM 收到错误响应后,会用修仙世界的语气告知用户:
抱歉,删除修士需要宗主权限。您目前是弟子身份,请联系宗主处理。
数据权限 — 峰主自动过滤
峰主只能操作本峰弟子,通过 checkPeakPermission() 检查:
java
String err = checkPeakPermission(user, "管理", ctx);
if (err != null) return error(err);
// "权限不足:您只能管理本峰弟子,【张三】属于其他峰"峰主查询时,建议在工具逻辑中通过 ctx.getPeakId() 自动过滤只查本峰数据。
权限矩阵
| 工具 | 最低权限 | 说明 |
|---|---|---|
| queryUserBasic | 弟子 | 基本信息 |
| queryUserDetail | 峰主 | 详细信息(含灵石) |
| manageUser | 峰主 | 新增/修改 |
| deleteUser | 宗主 | 删除 |
| adjustAssets | 峰主 | 调整灵石/贡献点 |
| exchangeManual | 弟子 | 兑换功法 |
| deleteResource | 宗主 | 删除资源 |