Skip to content

权限控制

概述

Claude Code 拥有一个多层权限系统,确保工具执行的安全性。权限决策从规则匹配到 ML 分类器,层层把关。

Source: src/types/permissions.ts, src/utils/permissions/

权限模式

typescript
type PermissionMode =
  | 'default'           // 每次都询问用户
  | 'plan'              // 仅在计划模式中询问
  | 'dontAsk'           // 跳过权限检查
  | 'bypassPermissions' // 自动允许危险操作
  | 'acceptEdits'       // 自动接受文件编辑
  | 'auto'              // 基于分类器自动审批

权限决策流程

权限规则

规则来源

typescript
type PermissionRuleSource =
  | 'userSettings'     // ~/.claude/settings.json
  | 'projectSettings'  // /project/.claude/settings.json
  | 'localSettings'    // .claude/settings.local.json
  | 'flagSettings'     // 远程功能标志
  | 'policySettings'   // 企业策略
  | 'cliArg'           // 命令行参数
  | 'command'          // 斜杠命令
  | 'session'          // 会话内规则

规则格式

typescript
type PermissionRule = {
  source: PermissionRuleSource
  ruleBehavior: 'allow' | 'deny' | 'ask'
  ruleValue: {
    toolName: string      // 工具名或模式
    ruleContent?: string  // 可选:内容模式
  }
}

规则匹配示例

规则匹配
"Bash"所有 BashTool 调用
"Bash(git *)"git clone, git push, ...
"Bash(npm install)"npm install
"FileEdit(package.json)"编辑 package.json
"FileEdit(*)"所有文件编辑

通配符匹配使用 glob 风格语法(* 匹配任意序列)。

工具级权限检查

每个工具通过 checkPermissions() 实现特定的权限逻辑:

typescript
// BashTool 的权限检查
async checkPermissions(input, context) {
  // 调用专门的 bash 权限模块
  return bashToolHasPermission(input.command, context.toolPermissionContext);
}

// FileEditTool 的权限检查
async checkPermissions(input, context) {
  return checkWritePermissionForTool(
    FileEditTool, input, context.toolPermissionContext
  );
}

// GrepTool 的权限检查
async checkPermissions(input, context) {
  return checkReadPermissionForTool(
    GrepTool, input, context.toolPermissionContext
  );
}

完整执行管线

Source: src/utils/toolExecution.ts

权限上下文

typescript
type ToolPermissionContext = {
  mode: PermissionMode
  alwaysAllowRules: { [source]: PermissionRule[] }
  alwaysDenyRules: { [source]: PermissionRule[] }
  alwaysAskRules: { [source]: PermissionRule[] }
  additionalWorkingDirectories: Map<string, AdditionalWorkingDirectory>
  isBypassPermissionsModeAvailable: boolean
}

BashTool 的安全模块

BashTool 拥有最复杂的权限系统:

模块大小功能
bashPermissions.ts98KB模式匹配、通配符规则
bashSecurity.ts102KBAST 解析,检测危险命令
readOnlyValidation.ts68KB正则检测写操作
sedValidation.ts21KB解析 sed 编辑操作
pathValidation.ts43KB路径范围检查

下一步