首页/权限系统

权限系统

多层权限控制与分类器审批

权限系统是 Claude Code 安全架构的核心。它通过多层权限源、规则匹配和分类器审批来控制工具的执行权限,确保 AI 不会执行危险操作。

核心要点

6 种权限模式:default, acceptEdits, bypassPermissions, plan, auto, bubble
3 种权限行为:allow, deny, ask
多层权限源:用户设置 → 项目设置 → 本地设置 → CLI 参数
分类器系统 — 2 阶段(fast + thinking)自动审批
危险权限剥离 — 自动移除高风险权限

设计亮点

两阶段分类器像法院系统

先过治安法庭(快速裁决,500毫秒),有争议才上诉到高级法院(深度审理)。90% 的案件在治安法庭就结案了

当 Claude 请求执行一个工具时,Stage 1 分类器用最多 64 个 Token 做出快速判断。如果是明显安全的操作(读取文件),直接放行。如果是明显危险的(删除文件),直接阻止。只有在模糊地带(如修改配置文件),才会启动 Stage 2 的完整推理。这让 90% 的权限检查在 500ms 内完成,而不是每次都花 2-3 秒做深度分析。两个阶段共享 prompt cache,所以 Stage 2 几乎不增加额外成本。

安全工具走 VIP 通道

就像机场安检,航空公司机组人员有快速通道——因为他们已经被充分审查过了

Read、Grep、Glob 这些只读工具被放在白名单里,完全跳过分类器。道理很简单:读取文件不可能造成破坏。跳过分类器每次省约 500ms 延迟和一次 API 调用费用。考虑到一次代码搜索任务可能调用几十次 Grep,这个优化累计节省了大量时间和成本。但白名单是保守的——只有不可能产生副作用的工具才有资格。

被没收的权限留有收据

就像海关没收违禁品后会开具扣押凭证——东西不让你带,但有记录证明你曾经试图带进来

当管理员的策略(policySettings)与用户设置冲突时,比如用户设了 bypassPermissions 但管理员禁止了,这条规则不是被默默删除,而是被移到 strippedDangerousRules 里。用户可以看到'你的这条规则因为策略限制被移除了'。这比无声失败好得多——用户不会困惑'为什么我配了但没生效',管理员也能审计哪些用户试图绕过安全策略。

模块架构图

加载架构图...
核心文件
types/permissions.ts400 LOC

权限类型定义:PermissionMode、PermissionBehavior 等

utils/permissions/permissions.ts600 LOC

权限检查核心逻辑

utils/permissions/permissionSetup.ts300 LOC

权限上下文初始化

utils/permissions/permissionExplainer.ts200 LOC

权限解释(用户可读)

hooks/useCanUseTool.tsx1,500 LOC

权限检查 React Hook(40K)

数据流程
1
工具调用请求
模型输出 tool_use
2
收集权限规则
从 6 层设置源合并
3
规则匹配
按工具名和内容匹配
4
权限决策
Allow / Ask / Deny
5
分类器审批
自动模式下 2 阶段审批
6
执行或拒绝
最终执行决策

关键代码

加载代码...

深入解析

权限系统是 Claude Code 最重要的安全机制,防止 AI 执行危险操作(如 rm -rf, git push --force)。每次 AI 请求调用工具时,都要经过权限检查。

auto 模式使用 2 阶段分类器:Stage 1(fast)用极少的 Token(最多 64 个)快速判断,如果判断为'允许'就直接放行;如果判断为'阻止',再进入 Stage 2(thinking)进行深度推理,减少误判。这个设计在安全性和延迟之间找到了精妙的平衡。

Stage 1 和 Stage 2 共享相同的系统提示词和用户内容,所以 Stage 2 可以命中 Stage 1 的 prompt cache(1 小时 TTL),几乎不增加额外的 API 成本。

安全工具免检通道:Read、Grep、Glob 等只读工具被放在 SAFE_YOLO_ALLOWLISTED_TOOLS 白名单中,完全跳过分类器调用。这每次节省一次 API 请求(~500ms 延迟 + 费用),对频繁调用的搜索工具影响巨大。

危险权限(如 bypassPermissions)在某些环境下会被自动剥离。被剥离的规则不是简单删除,而是移动到 strippedDangerousRules 字段,留有审计记录。

权限规则支持 MCP 服务器级前缀匹配:mcp__github 可以匹配来自 github 服务器的所有工具,mcp__github__* 是通配符写法。管理员可以一条规则禁用整个 MCP 服务器。

每个权限决策都包含详细的来源信息(来自哪个设置文件的哪条规则),方便用户追溯'为什么这个操作被允许/拒绝了'。

分类器使用 XML 格式的输出(<block>yes/no</block><reason>...</reason>),解析时会先剥离 <thinking> 标签内容,避免推理过程中的'yes'/'no'字样被误判为最终结论。

带自适应思考(adaptive thinking)的新模型需要特殊处理:不能简单地设置 thinking: false,而是给额外的 max_tokens 预算让模型自由使用思考能力。