跳到主要内容

权限控制

源码: permissions.ts | types/permissions.ts

1. 权限模型

Claude Code 使用三级权限模型:

┌─────────────────────────┐
│ Level 3: Auto-approve │ ← 自动执行(白名单工具)
├─────────────────────────┤
│ Level 2: Ask-first │ ← 每次需要用户确认
├─────────────────────────┤
│ Level 1: Deny │ ← 拒绝执行(黑名单)
└─────────────────────────┘

2. 权限配置

type PermissionLevel = 'allow' | 'ask' | 'deny'

interface PermissionConfig {
// 工具级别权限
toolPermissions: Record<string, PermissionLevel>

// 默认权限模式
defaultMode: 'ask' | 'auto' | 'manual'

// 允许自动执行的工具白名单
autoApprove: string[]

// 始终需要确认的工具
requireApproval: string[]
}

3. 权限检查流程

async function checkPermission(
tool: Tool,
input: unknown
): Promise<PermissionResult> {
const config = getPermissionConfig()

// 1. 检查工具是否在白名单
if (config.autoApprove.includes(tool.name)) {
return { level: 'allow' }
}

// 2. 检查工具是否在黑名单
if (config.requireApproval.includes(tool.name)) {
return { level: 'ask', reason: '工具需要确认' }
}

// 3. 检查输入风险
const risk = assessInputRisk(input)
if (risk === 'high') {
return { level: 'ask', reason: '高风险输入' }
}

// 4. 使用默认模式
switch (config.defaultMode) {
case 'auto': return { level: 'allow' }
case 'ask': return { level: 'ask' }
case 'manual': return { level: 'ask' }
}
}

4. 权限模式

模式行为适用场景
auto所有工具自动执行可信环境,CI/CD
ask每次工具调用需要确认默认模式,生产环境
manual完全手动控制高安全要求

5. 用户确认 UI

当权限级别为 ask 时:

Claude 想要执行: rm /tmp/old-file.txt
[Y]es [N]o [A]lways (always allow this tool)

你的选择: _

选项:

  • Yes: 执行当前调用
  • No: 拒绝当前调用
  • Always: 将该工具加入白名单

6. 权限持久化

// 权限配置存储位置
// ~/.claude/permissions.json
{
"autoApprove": ["FileRead", "Glob", "Grep"],
"requireApproval": ["Bash", "FileWrite", "Agent"],
"defaultMode": "ask"
}

上一节:Bash 安全 | 下一节:路径验证