权限控制
源码:
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"
}