SDK 權限
Claude Agent SDK 提供強大的權限控制,讓您能夠管理 Claude 在您的應用程式中如何使用工具。 本指南涵蓋如何使用canUseTool
回調、鉤子和 settings.json 權限規則來實現權限系統。有關完整的 API 文件,請參閱 TypeScript SDK 參考。
概述
Claude Agent SDK 提供四種互補的方式來控制工具使用:- 權限模式 - 影響所有工具的全域權限行為設定
- canUseTool 回調 - 針對其他規則未涵蓋的情況的執行時權限處理器
- 鉤子 - 使用自訂邏輯對每個工具執行進行細粒度控制
- 權限規則 (settings.json) - 具有整合 bash 命令解析的聲明式允許/拒絕規則
- 權限模式 - 設定整體權限行為(規劃、自動接受編輯、繞過檢查)
canUseTool
- 針對未涵蓋的情況進行動態批准,提示使用者權限- 鉤子 - 對所有工具執行進行程式化控制
- 權限規則 - 具有智慧 bash 命令解析的靜態策略
權限流程圖
處理順序: PreToolUse 鉤子 → 詢問規則 → 拒絕規則 → 權限模式檢查 → 允許規則 → canUseTool 回調 → PostToolUse 鉤子權限模式
權限模式提供對 Claude 如何使用工具的全域控制。您可以在呼叫query()
時設定權限模式,或在串流會話期間動態更改它。
可用模式
SDK 支援四種權限模式,每種都有不同的行為:模式 | 描述 | 工具行為 |
---|---|---|
default | 標準權限行為 | 適用正常權限檢查 |
plan | 規劃模式 - 無執行 | Claude 只能使用唯讀工具;在執行前呈現計劃 (目前在 SDK 中不支援) |
acceptEdits | 自動接受檔案編輯 | 檔案編輯和檔案系統操作會自動批准 |
bypassPermissions | 繞過所有權限檢查 | 所有工具都在沒有權限提示的情況下執行(請謹慎使用) |
設定權限模式
您可以透過兩種方式設定權限模式:1. 初始配置
在建立查詢時設定模式:2. 動態模式更改(僅限串流)
在串流會話期間更改模式:模式特定行為
接受編輯模式 (acceptEdits
)
在接受編輯模式中:
- 所有檔案編輯都會自動批准
- 檔案系統操作(mkdir、touch、rm 等)會自動批准
- 其他工具仍需要正常權限
- 當您信任 Claude 的編輯時,可加快開發速度
- 適用於快速原型設計和迭代
- 檔案編輯(Edit、MultiEdit、Write 工具)
- Bash 檔案系統命令(mkdir、touch、rm、mv、cp)
- 檔案建立和刪除
繞過權限模式 (bypassPermissions
)
在繞過權限模式中:
- 所有工具使用都會自動批准
- 不會出現權限提示
- 鉤子仍會執行(仍可阻止操作)
- 請極其謹慎使用 - Claude 擁有完整的系統存取權限
- 僅建議在受控環境中使用
權限流程中的模式優先順序
權限模式在權限流程中的特定點進行評估:- 鉤子首先執行 - 可以覆蓋任何模式
- 檢查拒絕規則 - 無論模式如何都會阻止工具
bypassPermissions
模式 - 如果啟用,允許所有剩餘工具- 檢查允許規則
- 其他模式影響特定工具行為
canUseTool
回調 - 處理剩餘情況
- 鉤子總是可以阻止工具使用,即使在
bypassPermissions
模式中 - 明確的拒絕規則會覆蓋所有權限模式
bypassPermissions
模式會覆蓋允許規則和canUseTool
最佳實踐
- 使用預設模式進行受控執行與正常權限檢查
- 使用 acceptEdits 模式處理隔離的檔案或目錄時
- 避免在生產環境或有敏感資料的系統上使用 bypassPermissions
- 結合模式與鉤子進行細粒度控制
- 根據任務進度和信心動態切換模式
canUseTool
canUseTool
回調在呼叫 query
函數時作為選項傳遞。它接收工具名稱和輸入參數,並必須返回決定 - 允許或拒絕。
當 Claude Code 會向使用者顯示權限提示時,canUseTool 會觸發,例如鉤子和權限規則未涵蓋它且不在自動接受模式中。
以下是一個完整的範例,展示如何實現互動式工具批准:
使用鉤子進行工具控制
鉤子在各個階段提供對工具執行的程式化控制。鉤子會針對每個工具使用進行呼叫,讓您完全控制權限管道。鉤子實現
與 canUseTool 的主要差異
- 範圍:鉤子會針對所有工具使用進行呼叫;
canUseTool
處理權限規則未涵蓋的情況 - 控制:鉤子需要您自己解析和驗證輸入
- 事件:鉤子支援多個事件(PreToolUse、PostToolUse 等)用於不同階段
使用權限規則 (settings.json)
settings.json
中的權限規則提供具有內建 bash 命令解析的聲明式控制。這些規則在呼叫 canUseTool
之前進行評估。有關設定配置的更多詳細資訊,請參閱 Claude Code 設定文件。
配置結構
規則語法
權限規則遵循模式:ToolName(pattern)
- Bash 規則:使用前綴匹配(非正規表達式)。範例:
Bash(npm:*)
匹配任何以 “npm” 開頭的命令 - 檔案規則:支援 glob 模式。範例:
Read(./src/**/*.ts)
匹配 src 中的 TypeScript 檔案 - 僅工具規則:省略括號以控制整個工具。範例:
WebFetch
阻止所有網路擷取
與 SDK 一起使用
雖然規則尚無法在 SDK 中以程式化方式設定,但它們會從載入 SDK 的路徑中的 settings.json 檔案讀取。權限評估順序
- 首先檢查拒絕規則 - 如果匹配,工具使用會被阻止
- 接著檢查允許規則 - 如果匹配,工具使用會被允許
- 檢查詢問規則 - 如果匹配,會提示使用者
- 針對任何剩餘情況呼叫 canUseTool 回調
Bash 命令解析
SDK 包含一個整合的 bash 解析器,能理解命令結構:- 處理管道、重新導向和命令替換
- 識別危險模式,如
rm -rf
或curl | sh
- 支援萬用字元和前綴匹配
Bash(git:*)
- 匹配任何 git 命令Bash(npm run test)
- 匹配確切命令Bash(npm run test:*)
- 匹配以npm run test
開頭的 Bash 命令,如npm run test anyFile.test.ts
最佳實踐
- 從預設模式開始進行標準權限檢查
- 使用權限規則進行靜態策略,特別是 bash 命令(請參閱權限設定)
- 使用鉤子記錄、稽核或轉換所有工具使用(請參閱鉤子類型)
- 使用 canUseTool針對未涵蓋的情況進行動態決定(請參閱CanUseTool 類型)
- 透過結合模式、規則、鉤子和回調來分層防禦,適用於關鍵應用程式