权限系统
权限系统是 Claude Code 的安全基石。每一次工具调用都会经过权限系统的检查,确保 AI 不会执行未经授权的操作。
设计理念
权限先行:所有外部操作都必须经过权限审核。
Claude Code 在安全性和可用性之间找到了平衡——默认安全,但允许用户根据需要放宽限制。
权限模式
| 模式 | 代码标识 | 行为 |
|---|---|---|
| 默认模式 | default | 危险操作需要用户确认 |
| 计划模式 | plan | 只允许只读操作 |
| 跳过权限 | bypassPermissions | 跳过所有权限检查 |
| 自动模式 | auto | 智能判断是否需要确认 |
| 接受编辑 | acceptEdits | 自动接受文件编辑 |
| 不询问 | dontAsk | 直接执行,不询问 |
权限检查流程
工具调用请求
↓
检查权限模式
↓
╔══════════════════════════╗
║ bypassPermissions? ║──→ 直接执行
║ plan 模式? ║──→ 是否只读?
║ 工具在白名单中? ║──→ 直接执行
║ 工具是否 isReadOnly? ║──→ 直接执行
║ 用户已预先授权? ║──→ 直接执行
╚══════════════════════════╝
↓(都不满足)
提示用户确认
↓
用户允许 → 执行
用户拒绝 → 跳过,通知 LLM
权限配置
在 settings.local.json 中可以预先授权特定工具:
{
"permissions": {
"allow": [
"WebSearch",
"mcp__context7__query-docs",
"mcp__plugin_telegram_telegram__reply"
]
}
}
全局配置 vs 项目配置
| 配置文件 | 路径 | 范围 |
|---|---|---|
| 全局设置 | ~/.claude/settings.json | 所有项目 |
| 本地设置 | ~/.claude/settings.local.json | 所有项目(不提交) |
| 项目设置 | .claude/settings.json | 当前项目 |
| 项目本地 | .claude/settings.local.json | 当前项目(不提交) |
工具分类
安全工具(不需要确认)
FileReadTool— 只读操作GlobTool— 文件搜索GrepTool— 内容搜索WebSearchTool— 网络搜索
需要确认的工具
BashTool— 可能执行危险命令FileWriteTool— 文件写入FileEditTool— 文件修改AgentTool— 启动子 Agent
危险操作检测
Claude Code 内置了危险操作检测:
危险操作示例:
- rm -rf / ← 删除根目录
- git reset --hard ← 丢弃未提交变更
- git push --force ← 强制推送
- DROP TABLE ← 删除数据库表
- kubectl delete ← 删除 K8s 资源
检测到危险操作时,即使在宽松权限模式下也会发出警告。
用户拒绝处理
当用户拒绝工具调用时,LLM 会收到通知:
- 不再重试相同的调用
- 分析拒绝原因
- 调整方案重新尝试
- 如果不理解原因,询问用户