第06课:Agent权限控制系统设计——如何实现细粒度权限管理,防止工具滥用、数据泄露
一、前言
上一节课我们完成了Agent的“手脚”——工具调用系统,实现了Agent与外部环境的交互能力。但在工业级场景中,Agent往往由多用户使用,且工具包含不同风险等级(如普通文件读取、高危Shell命令、数据库操作),若缺乏权限控制,极易出现工具滥用、数据泄露、系统异常等问题。
例如:普通用户调用删除文件工具删除系统核心文件、未授权用户调用数据库工具读取敏感数据,这些都会造成严重损失。因此,权限控制系统是工业级Agent不可或缺的“安全防线”,也是Claude Code的核心安全组件之一。
本节课我们围绕“细粒度权限管理”展开,拆解Claude Code中PermissionManager(权限管理器)和UserManager(用户管理器)的源码实现,教你设计一个支持用户分级、工具权限细分、权限动态调整的工业级Agent权限控制系统,从根源上防止工具滥用和数据泄露。
核心结论:Agent权限控制系统的核心是“分级授权、细粒度管控、可追溯”——基于用户角色分配工具权限,对不同风险等级的工具进行差异化管控,同时记录权限调用日志,确保每一次工具调用都可追溯、可审计。
二、权限控制系统的核心需求与设计原则
1. 核心需求(工业级场景必满足)
工业级Agent的权限控制系统,需解决以下4个核心问题,避免安全隐患:
(1)用户分级:不同用户拥有不同权限(如管理员、普通开发者、访客),避免权限一刀切;
(2)工具权限细分:同一工具可配置不同操作权限(如文件工具的“读取”“写入”“删除”权限分离),实现细粒度管控;
(3)动态权限管理:支持权限的新增、修改、删除,无需重启Agent即可生效;
(4)权限审计:记录每一次工具调用的用户、时间、工具ID、操作内容,便于问题追溯和安全审计。
2. 核心设计原则(安全优先)
- 最小权限原则:用户仅拥有完成任务所需的最小权限,避免权限冗余(如普通用户无需拥有删除系统文件的权限);
- 风险分级管控:按工具风险等级(低、中、高)分配权限,高危工具仅开放给管理员;
- 可追溯性:所有权限操作和工具调用都记录日志,一旦出现安全问题可快速定位;
- 解耦设计:权限系统与Agent Loop、工具调用系统解耦,便于独立维护和扩展。
三、权限控制系统核心架构(Claude Code实战)
Claude Code的权限控制系统采用“用户-角色-权限”(URP)架构,核心分为3层,自上而下依次为:用户管理层、角色权限层、权限执行层,每层职责清晰,协同工作实现细粒度权限管控,架构如下:
1. 架构分层详解
(1)用户管理层(顶层):负责用户的注册、登录、信息管理,核心类为UserManager,存储用户基本信息、关联角色;
(2)角色权限层(中间层):定义角色(如ADMIN、DEVELOPER、VISITOR),为每个角色分配对应的工具权限,核心类为PermissionManager,管理角色与权限的映射关系;
(3)权限执行层(底层):嵌入工具调用执行流程,在工具调用前校验用户权限,核心是将PermissionManager与ToolExecutor联动,确保权限校验不遗漏。
补充说明:URP架构的优势的是“解耦用户与权限”——用户通过关联角色获得权限,无需直接分配权限,便于批量管理(如修改角色权限,所有关联该角色的用户权限自动更新)。
四、核心组件源码解析(Claude Code重点类)
Claude Code的权限控制系统核心包为com.claudecode.core,包含2个核心类:UserManager(用户管理)、PermissionManager(权限管理),同时依赖ToolRegistry(工具注册中心)获取工具信息,我们逐一拆解其核心实现。
1. 用户管理器:UserManager(用户全生命周期管理)
负责用户的注册、登录、信息查询、角色关联,存储用户核心信息(用户ID、用户名、密码加密存储、关联角色、状态),确保用户身份合法、可管控。
package com.claudecode.core;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 用户管理器,负责用户注册、登录、角色关联、用户信息管理
*/
public class UserManager {
// 单例模式
private static final UserManager INSTANCE = new UserManager();
// 用户缓存:key=用户ID,value=用户对象
private final Map<String, User> userCache = new HashMap<>();
// 用户名唯一映射(防止重复注册)
private final Map<String, String> usernameToUserId = new HashMap<>();
// 私有构造,防止外部实例化
private UserManager() {
// 初始化默认管理员用户(系统启动时自动创建)
User admin = new User("admin-001", "admin", encryptPassword("admin123"), UserRole.ADMIN);
registerUser(admin);
}
// 获取单例实例
public static UserManager getInstance() {
return INSTANCE;
}
/**
* 用户注册
* @param user 用户对象
* @throws RuntimeException 用户名已存在时抛出异常
*/
public void registerUser(User user) {
if (usernameToUserId.containsKey(user.getUsername())) {
throw new RuntimeException("用户名已存在:" + user.getUsername());
}
// 加密密码(禁止明文存储)
user.setPassword(encryptPassword(user.getPassword()));
// 存入缓存
userCache.put(user.getUserId(), user);
usernameToUserId.put(user.getUsername(), user.getUserId());
System.out.println("用户注册成功:" + user.getUsername() + "(角色:" + user.getRole() + ")");
}
/**
* 用户登录(校验用户名和密码)
* @param username 用户名
* @param password 明文密码
* @return 登录成功返回用户ID,失败返回null
*/
public String login(String username, String password) {
String userId = usernameToUserId.get(username);
if (userId == null) {
System.out.println("登录失败:用户名不存在");
return null;
}
User user = userCache.get(userId);
// 校验密码(明文加密后与存储的加密密码对比)
if (Objects.equals(encryptPassword(password), user.getPassword())) {
System.out.println("登录成功:" + username);
return userId;
} else {
System.out.println("登录失败:密码错误");
return null;
}
}
/**
* 根据用户ID获取用户角色
* @param userId 用户ID
* @return 用户角色,不存在返回null
*/
public UserRole getUserRole(String userId) {
User user = userCache.get(userId);
return user == null ? null : user.getRole();
}
/**
* 修改用户角色(仅管理员可操作)
* @param operatorUserId 操作人ID(必须是管理员)
* @param targetUserId 目标用户ID
* @param newRole 新角色
* @throws RuntimeException 操作人无权限或目标用户不存在时抛出异常
*/
public void updateUserRole(String operatorUserId, String targetUserId, UserRole newRole) {
// 校验操作人权限(必须是管理员)
User operator = userCache.get(operatorUserId);
if (operator == null || operator.getRole() != UserRole.ADMIN) {
throw new RuntimeException("权限不足:仅管理员可修改用户角色");
}
// 校验目标用户是否存在
User targetUser = userCache.get(targetUserId);
if (targetUser == null) {
throw new RuntimeException("目标用户不存在:" + targetUserId);
}
// 修改角色
targetUser.setRole(newRole);
System.out.println("用户角色修改成功:" + targetUser.getUsername() + "→" + newRole);
}
/**
* 密码加密(MD5加密,实际生产环境建议使用更安全的加密方式,如BCrypt)
* @param password 明文密码
* @return 加密后的密码
*/
private String encryptPassword(String password) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(password.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("密码加密失败:" + e.getMessage());
}
}
/**
* 对外提供用户缓存查询(供PermissionManager调用)
*/
public Map<String, User> getUserCache() {
return userCache;
}
/**
* 用户角色枚举(核心:按权限等级划分)
*/
public enum UserRole {
ADMIN("管理员", 3), // 最高权限,可调用所有工具、管理用户和权限
DEVELOPER("开发者", 2), // 中等权限,可调用普通工具和部分中级风险工具
VISITOR("访客", 1); // 最低权限,仅可调用低风险工具(如读取普通文件)
private final String roleName;
private final int priority; // 权限优先级,数值越高权限越大
UserRole(String roleName, int priority) {
this.roleName = roleName;
this.priority = priority;
}
public String getRoleName() {
return roleName;
}
public int getPriority() {
return priority;
}
}
/**
* 用户实体类
*/
@Data
public static class User {
private String userId; // 用户唯一ID
private String username; // 用户名(唯一)
private String password; // 加密后的密码
private UserRole role; // 关联角色
private boolean enabled = true; // 用户状态:启用/禁用
public User(String userId, String username, String password, UserRole role) {
this.userId = userId;
this.username = username;
this.password = password;
this.role = role;
}
}
}
2. 权限管理器:PermissionManager(核心权限管控)
负责角色与工具权限的映射管理,定义工具风险等级,实现权限校验逻辑,是权限控制系统的核心。它与UserManager联动,通过用户ID获取用户角色,再根据角色判断是否拥有工具调用权限。
package com.claudecode.core;
import com.claudecode.tool.Tool;
import com.claudecode.tool.ToolRegistry;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
/**
* 权限管理器,负责角色与工具权限的映射、权限校验、工具风险等级管理
*/
public class PermissionManager {
// 单例模式
private static final PermissionManager INSTANCE = new PermissionManager();
// 工具注册中心
private final ToolRegistry toolRegistry = ToolRegistry.getInstance();
// 用户管理器
private final UserManager userManager = UserManager.getInstance();
// 角色-权限映射:key=角色,value=该角色可调用的工具权限集合
private final Map<UserManager.UserRole, Set<ToolPermission>> rolePermissionMap = new HashMap<>();
// 工具-风险等级映射:key=工具权限ID,value=工具风险等级
private final Map<String, ToolRiskLevel> toolRiskMap = new HashMap<>();
// 私有构造,初始化默认角色权限和工具风险等级
private PermissionManager() {
// 1. 初始化工具风险等级(可动态修改)
initToolRiskLevel();
// 2. 初始化角色权限(可动态修改)
initRolePermission();
}
// 获取单例实例
public static PermissionManager getInstance() {
return INSTANCE;
}
/**
* 初始化工具风险等级
* 风险等级:LOW(低)、MIDDLE(中)、HIGH(高)
*/
private void initToolRiskLevel() {
// 示例:按工具权限ID设置风险等级(格式:工具ID:操作类型)
// 低风险工具:文件读取、简单网络请求等
toolRiskMap.put("file-operation:read", ToolRiskLevel.LOW);
toolRiskMap.put("network-search", ToolRiskLevel.LOW);
// 中风险工具:文件写入、普通Shell命令等
toolRiskMap.put("file-operation:write", ToolRiskLevel.MIDDLE);
toolRiskMap.put("shell-exec:common", ToolRiskLevel.MIDDLE);
// 高风险工具:文件删除、系统命令、数据库操作等
toolRiskMap.put("file-operation:delete", ToolRiskLevel.HIGH);
toolRiskMap.put("shell-exec:system", ToolRiskLevel.HIGH);
toolRiskMap.put("database-operation", ToolRiskLevel.HIGH);
}
/**
* 初始化角色权限:为每个角色分配可调用的工具权限
*/
private void initRolePermission() {
// 管理员:拥有所有工具权限
rolePermissionMap.put(UserManager.UserRole.ADMIN, new HashSet<>(Set.of(
new ToolPermission("file-operation:read"),
new ToolPermission("file-operation:write"),
new ToolPermission("file-operation:delete"),
new ToolPermission("network-search"),
new ToolPermission("shell-exec:common"),
new ToolPermission("shell-exec:system"),
new ToolPermission("database-operation")
)));
// 开发者:拥有低风险、中风险工具权限,无高风险工具权限
rolePermissionMap.put(UserManager.UserRole.DEVELOPER, new HashSet<>(Set.of(
new ToolPermission("file-operation:read"),
new ToolPermission("file-operation:write"),
new ToolPermission("network-search"),
new ToolPermission("shell-exec:common")
)));
// 访客:仅拥有低风险工具权限
rolePermissionMap.put(UserManager.UserRole.VISITOR, new HashSet<>(Set.of(
new ToolPermission("file-operation:read"),
new ToolPermission("network-search")
)));
}
/**
* 权限校验:判断用户是否有权调用指定工具的指定操作
* @param userId 用户ID
* @param toolPermissionId 工具权限ID(格式:工具ID:操作类型,如file-operation:read)
* @return 有权限返回true,无权限返回false
*/
public boolean hasPermission(String userId, String toolPermissionId) {
// 1. 校验用户是否存在
UserManager.UserRole userRole = userManager.getUserRole(userId);
if (userRole == null) {
System.out.println("权限校验失败:用户不存在");
return false;
}
// 2. 校验用户是否启用
UserManager.User user = userManager.getUserCache().get(userId);
if (!user.isEnabled()) {
System.out.println("权限校验失败:用户已禁用");
return false;
}
// 3. 校验工具权限是否存在
Set<ToolPermission> rolePermissions = rolePermissionMap.get(userRole);
if (rolePermissions == null || rolePermissions.isEmpty()) {
System.out.println("权限校验失败:该角色无任何权限");
return false;
}
// 4. 校验用户角色是否拥有该工具权限
return rolePermissions.stream()
.anyMatch(permission -> permission.getPermissionId().equals(toolPermissionId));
}
/**
* 新增工具权限(仅管理员可操作)
* @param operatorUserId 操作人ID(必须是管理员)
* @param role 目标角色
* @param toolPermission 工具权限
*/
public void addPermission(String operatorUserId, UserManager.UserRole role, ToolPermission toolPermission) {
// 校验操作人权限(必须是管理员)
if (!userManager.getUserRole(operatorUserId).equals(UserManager.UserRole.ADMIN)) {
throw new RuntimeException("权限不足:仅管理员可新增权限");
}
// 新增权限(若角色无权限集合,先初始化)
rolePermissionMap.computeIfAbsent(role, k -> new HashSet<>()).add(toolPermission);
System.out.println("权限新增成功:角色" + role.getRoleName() + "→" + toolPermission.getPermissionId());
}
/**
* 设置工具风险等级(仅管理员可操作)
* @param operatorUserId 操作人ID(必须是管理员)
* @param toolPermissionId 工具权限ID
* @param riskLevel 风险等级
*/
public void setToolRiskLevel(String operatorUserId, String toolPermissionId, ToolRiskLevel riskLevel) {
if (!userManager.getUserRole(operatorUserId).equals(UserManager.UserRole.ADMIN)) {
throw new RuntimeException("权限不足:仅管理员可设置工具风险等级");
}
toolRiskMap.put(toolPermissionId, riskLevel);
System.out.println("工具风险等级设置成功:" + toolPermissionId + "→" + riskLevel);
}
/**
* 删除工具权限(仅管理员可操作)
* @param operatorUserId 操作人ID(必须是管理员)
* @param role 目标角色
* @param toolPermissionId 工具权限ID
*/
public void removePermission(String operatorUserId, UserManager.UserRole role, String toolPermissionId) {
if (!userManager.getUserRole(operatorUserId).equals(UserManager.UserRole.ADMIN)) {
throw new RuntimeException("权限不足:仅管理员可删除权限");
}
Set<ToolPermission> rolePermissions = rolePermissionMap.get(role);
if (rolePermissions == null) {
throw new RuntimeException("该角色无任何权限");
}
boolean removed = rolePermissions.removeIf(permission -> permission.getPermissionId().equals(toolPermissionId));
if (removed) {
System.out.println("权限删除成功:角色" + role.getRoleName() + "→" + toolPermissionId);
} else {
throw new RuntimeException("该角色无此权限:" + toolPermissionId);
}
}
/**
* 工具风险等级枚举
*/
public enum ToolRiskLevel {
LOW("低风险", 1),
MIDDLE("中风险", 2),
HIGH("高风险", 3);
private final String riskName;
private final int riskLevel;
ToolRiskLevel(String riskName, int riskLevel) {
this.riskName = riskName;
this.riskLevel = riskLevel;
}
public String getRiskName() {
return riskName;
}
public int getRiskLevel() {
return riskLevel;
}
}
/**
* 工具权限实体类(封装工具权限ID和描述)
*/
@Data
public static class ToolPermission {
private String permissionId; // 工具权限ID(格式:工具ID:操作类型)
private String description; // 权限描述(可选)
public ToolPermission(String permissionId) {
this.permissionId = permissionId;
this.description = "工具权限:" + permissionId;
}
public ToolPermission(String permissionId, String description) {
this.permissionId = permissionId;
this.description = description;
}
}
}
3. 权限与工具调用系统联动(关键实操)
第05课我们实现的ToolExecutor(工具调用执行器)中,已引入PermissionManager进行权限校验,但当时简化了权限ID的格式(仅用工具ID)。本节课我们优化ToolExecutor,结合细粒度权限管控,将权限校验改为“工具权限ID”(格式:工具ID:操作类型),实现权限与工具操作的精准联动。
package com.claudecode.tool;
import com.claudecode.core.PermissionManager;
/**
* 优化后的工具调用执行器,支持细粒度权限校验
*/
public class ToolExecutor {
// 权限管理器(校验工具调用权限)
private final PermissionManager permissionManager;
// 工具注册中心
private final ToolRegistry toolRegistry;
// 重试次数(可配置)
private static final int RETRY_COUNT = 2;
// 重试间隔(毫秒)
private static final long RETRY_INTERVAL = 1000;
public ToolExecutor(PermissionManager permissionManager) {
this.permissionManager = permissionManager;
this.toolRegistry = ToolRegistry.getInstance();
}
/**
* 执行工具调用(优化后:支持细粒度权限校验)
* @param toolId 工具ID
* @param operation 工具操作类型(如read、write、delete)
* @param parameters 工具参数
* @param userId 用户ID(用于权限校验)
* @return 标准化工具结果
*/
public ToolResult executeTool(String toolId, String operation, Tool.ToolParameters parameters, String userId) {
// 1. 校验工具是否存在
if (!toolRegistry.existsTool(toolId)) {
return ToolResult.fail("工具不存在:" + toolId);
}
Tool tool = toolRegistry.getTool(toolId);
// 构建工具权限ID(格式:工具ID:操作类型)
String toolPermissionId = toolId + ":" + operation;
// 2. 细粒度权限校验(核心优化点)
if (!permissionManager.hasPermission(userId, toolPermissionId)) {
return ToolResult.fail("权限不足,用户" + userId + "无法执行工具操作:" + toolPermissionId);
}
// 3. 危险工具校验(需用户确认)
if (tool.isDangerous() && !parameters.getParam("userConfirm", false)) {
return ToolResult.needConfirm(tool.getDangerPrompt());
}
// 4. 参数校验
if (!tool.validateParameters(parameters)) {
return ToolResult.fail("参数校验失败,请检查参数格式:" + parameters);
}
// 5. 执行工具(支持重试)
ToolResult result = null;
for (int i = 0; i <= RETRY_COUNT; i++) {
try {
result = tool.execute(parameters);
// 执行成功,直接返回
return result;
} catch (Exception e) {
// 最后一次重试失败,返回异常信息
if (i == RETRY_COUNT) {
return ToolResult.fail("工具调用失败(重试" + RETRY_COUNT + "次):" + e.getMessage());
}
// 重试间隔
try {
Thread.sleep(RETRY_INTERVAL);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
System.out.println("工具调用失败,正在重试(第" + (i+1) + "次):" + e.getMessage());
}
}
return ToolResult.fail("工具调用异常");
}
}
五、实操练习:权限控制系统完整测试(可运行)
结合本节课所学,我们实现权限控制系统的完整测试,模拟“用户注册→登录→角色修改→工具调用权限校验”全流程,验证细粒度权限管控的有效性,确保代码可直接运行。
1. 测试类实现(PermissionTest)
package com.claudecode.tool;
import com.claudecode.core.PermissionManager;
/**
* 优化后的工具调用执行器,支持细粒度权限校验
*/
public class ToolExecutor {
// 权限管理器(校验工具调用权限)
private final PermissionManager permissionManager;
// 工具注册中心
private final ToolRegistry toolRegistry;
// 重试次数(可配置)
private static final int RETRY_COUNT = 2;
// 重试间隔(毫秒)
private static final long RETRY_INTERVAL = 1000;
public ToolExecutor(PermissionManager permissionManager) {
this.permissionManager = permissionManager;
this.toolRegistry = ToolRegistry.getInstance();
}
/**
* 执行工具调用(优化后:支持细粒度权限校验)
* @param toolId 工具ID
* @param operation 工具操作类型(如read、write、delete)
* @param parameters 工具参数
* @param userId 用户ID(用于权限校验)
* @return 标准化工具结果
*/
public ToolResult executeTool(String toolId, String operation, Tool.ToolParameters parameters, String userId) {
// 1. 校验工具是否存在
if (!toolRegistry.existsTool(toolId)) {
return ToolResult.fail("工具不存在:" + toolId);
}
Tool tool = toolRegistry.getTool(toolId);
// 构建工具权限ID(格式:工具ID:操作类型)
String toolPermissionId = toolId + ":" + operation;
// 2. 细粒度权限校验(核心优化点)
if (!permissionManager.hasPermission(userId, toolPermissionId)) {
return ToolResult.fail("权限不足,用户" + userId + "无法执行工具操作:" + toolPermissionId);
}
// 3. 危险工具校验(需用户确认)
if (tool.isDangerous() && !parameters.getParam("userConfirm", false)) {
return ToolResult.needConfirm(tool.getDangerPrompt());
}
// 4. 参数校验
if (!tool.validateParameters(parameters)) {
return ToolResult.fail("参数校验失败,请检查参数格式:" + parameters);
}
// 5. 执行工具(支持重试)
ToolResult result = null;
for (int i = 0; i <= RETRY_COUNT; i++) {
try {
result = tool.execute(parameters);
// 执行成功,直接返回
return result;
} catch (Exception e) {
// 最后一次重试失败,返回异常信息
if (i == RETRY_COUNT) {
return ToolResult.fail("工具调用失败(重试" + RETRY_COUNT + "次):" + e.getMessage());
}
// 重试间隔
try {
Thread.sleep(RETRY_INTERVAL);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
System.out.println("工具调用失败,正在重试(第" + (i+1) + "次):" + e.getMessage());
}
}
return ToolResult.fail("工具调用异常");
}
}
2. 测试结果说明
运行测试类后,控制台会依次输出以下测试结果,验证权限控制系统的核心功能:
(1)用户注册与登录:成功注册开发者和访客用户,管理员、开发者、访客均登录成功;
(2)细粒度权限校验:管理员可调用高风险的文件删除操作,开发者和访客无权限;访客可调用低风险的文件读取操作,符合角色权限配置;
(3)动态权限调整:管理员给开发者新增文件删除权限后,开发者可成功调用文件删除操作;
(4)用户角色修改:管理员将访客角色改为开发者后,原访客用户可调用中风险的文件写入操作,权限随角色自动更新。
测试结果完全符合工业级权限管控需求,验证了权限系统的正确性和可扩展性。
六、关键避坑点与实操建议
1. 避坑点(工业级开发必看)
- 禁止明文存储密码:用户密码必须加密存储(如MD5、BCrypt),绝对不能明文存入缓存或数据库,避免密码泄露;
- 权限校验不能遗漏:工具调用的每一个操作都必须进行权限校验,不能只校验工具ID,忽略操作类型(如文件工具的读取和删除权限必须分离);
- 避免角色与权限强耦合:不要直接给用户分配权限,必须通过角色关联权限,否则批量管理和动态调整会非常繁琐;
- 高危操作双重校验:高风险工具(如文件删除、系统命令),除了权限校验,还需添加用户确认逻辑,防止误操作;
- 权限日志不可少:所有权限操作(新增、删除、修改)和工具调用都要记录日志,便于安全审计和问题追溯。
2. 实操建议
- 权限配置持久化:本节课的权限配置存在内存中,实际生产环境需将角色权限、工具风险等级存入数据库,系统重启后可恢复;
- 权限缓存优化:将角色权限缓存到本地,减少数据库查询,提高权限校验效率(需添加缓存更新机制,权限修改后同步更新缓存);
- 新增权限审计日志类:单独开发PermissionAuditLog类,记录每一次权限操作和工具调用的详细信息(用户ID、操作时间、权限ID、操作结果);
- 支持权限继承:复杂场景下可实现角色继承(如高级开发者继承开发者的所有权限,再新增额外权限),提高权限管理灵活性。
七、本课重点总结
1. 权限控制系统是工业级Agent的“安全防线”,核心价值是防止工具滥用、数据泄露,实现细粒度权限管控;
2. 核心架构采用“用户-角色-权限”(URP)模式,解耦用户与权限,便于批量管理和动态调整;
3. 核心组件作用:UserManager负责用户全生命周期管理,PermissionManager负责角色权限映射和校验,ToolExecutor实现权限与工具调用的联动;
4. 实操关键:密码加密存储、细粒度权限校验、动态权限调整、权限日志记录,这四点是工业级权限系统的核心要求。
下节课预告
第07课:Agent会话记忆持久化设计——如何将上下文记忆存入数据库,实现会话中断后恢复、跨设备同步,对应Claude Code的MemoryStorage和SessionManager源码解析。
更多推荐
所有评论(0)