Bỏ qua để đến nội dung

Cấu hình permission

Bài viết được dịch tự động từ bài viết gốc, chưa được kiểm tra lại bởi con người. Chỉ những bài viết có dấu tick xanh cạnh tiêu đề là đã được kiểm tra.

Claude Agent SDK cung cấp permission control để quản lý cách Claude dùng tool. Dùng permission mode và rule để định nghĩa những gì được phép tự động, và canUseTool callback để xử lý mọi thứ còn lại tại runtime.

Khi Claude yêu cầu một tool, SDK kiểm tra permission theo thứ tự này:

  1. Hooks. Chạy hook trước tiên. Một hook có thể deny lời gọi hoàn toàn hoặc chuyển tiếp nó. Một hook trả về allow không bỏ qua các rule deny và ask bên dưới; những rule đó vẫn được đánh giá bất kể kết quả hook.

  2. Deny rule. Kiểm tra deny rule (từ disallowed_toolssettings.json). Nếu một deny rule khớp, tool bị chặn, kể cả trong mode bypassPermissions. Deny rule dạng tên trần như Bash loại bỏ tool khỏi context của Claude trước khi bước đánh giá này bắt đầu, nên chỉ rule có scope như Bash(rm *) mới được kiểm tra ở bước này.

  3. Ask rule. Kiểm tra ask rule từ settings.json. Nếu một ask rule khớp, lời gọi rơi xuống canUseTool callback của bạn để xác nhận, kể cả trong mode bypassPermissions.

    Tool cần tương tác người dùng hoạt động tương tự: AskUserQuestion và MCP tool mà server của nó đặt _meta["anthropic/requiresUserInteraction"] luôn rơi xuống callback, kể cả khi một allow rule khớp. Trong mode dontAsk cả hai trường hợp đều bị deny thay vì rơi xuống callback, vì mode đó không bao giờ hỏi. Annotation MCP này yêu cầu Claude Code v2.1.199 trở lên.

    Tool claude.ai connector mà tổ chức của bạn đặt thành ask cũng rời khỏi flow ở bước này. Mọi lời gọi đều rơi xuống callback, kể cả trong mode bypassPermissions và kể cả khi một allow rule khớp. Callback nhận reason Your organization requires approval for this tool. Trong mode dontAsk, lời gọi bị deny thay vì rơi xuống callback, vì mode đó không bao giờ hỏi.

  4. Permission mode. Áp dụng permission mode đang active. bypassPermissions approve mọi thứ tới được bước này. acceptEdits approve các thao tác file. plan chuyển tool sửa file và tool ghi shell tới canUseTool callback của bạn bất kể allow rule, nên thao tác ghi không thể được tự động approve khi đang plan. Các mode khác rơi xuống bước tiếp theo.

  5. Allow rule. Kiểm tra allow rule (từ allowed_tools và settings.json). Nếu một rule khớp, tool được approve.

  6. canUseTool callback. Nếu không được giải quyết bởi bất kỳ bước nào ở trên, gọi canUseTool callback của bạn để đưa quyết định. Trong mode dontAsk, bước này bị bỏ qua và tool bị deny.

Sơ đồ flow đánh giá permission sáu bước khớp với các bước ở trên: một tool request đi qua hooks, deny rules, ask rules, permission mode, allow rules, và canUseTool. Hooks, deny rules, và canUseTool có thể dẫn xuống Blocked; permission mode bypass, allow rules, và canUseTool có thể dẫn lên Execute; ask rules dẫn tới canUseTool.

Kể từ v2.1.198, nếu bạn truyền một canUseTool callback mà thứ tự đánh giá này không bao giờ chạm tới được, TypeScript SDK phát một Node.js process warning một lần khi query được khởi tạo. Code của warning là CLAUDE_SDK_CAN_USE_TOOL_SHADOWED. Hai cấu hình kích hoạt nó:

  • permissionMode: 'bypassPermissions', tự động approve mọi lời gọi tới được bước permission mode
  • Mỗi entry allowedTools dạng tên trần như "Read", tự động approve toàn bộ tool đó trước khi callback được hỏi

Entry có specifier như Bash(ls *) và mode acceptEdits không kích hoạt warning này, và allow rule đến từ settings file thì không nhìn thấy được với check này.

Lắng nghe bằng process.on('warning', ...) và so khớp code để log hoặc bỏ qua nó. Để chặn mọi tool call bất kể mode và rule, dùng PreToolUse hook thay vào đó.

Trang này tập trung vào allow và deny rulepermission mode. Với các bước khác:

allowed_toolsdisallowed_tools (TypeScript: allowedTools / disallowedTools) thêm entry vào danh sách allow và deny rule trong flow đánh giá ở trên. Allow rule chỉ ảnh hưởng tới approval: một tool không nằm trong allowed_tools vẫn khả dụng với Claude và rơi xuống permission mode. Deny rule hoạt động khác nhau tuỳ vào việc nó chỉ đích danh một tool hay scope một pattern trong tool đó.

OptionHiệu ứng
allowed_tools=["Read", "Grep"]ReadGrep được tự động approve. Tool không có trong danh sách này vẫn tồn tại và rơi xuống permission mode và canUseTool.
disallowed_tools=["Bash"]Định nghĩa tool Bash bị loại khỏi request. Claude không thấy tool này và không thể thử gọi nó.
disallowed_tools=["Bash(rm *)"]Bash vẫn khả dụng. Lời gọi khớp rm * bị deny trong mọi permission mode, kể cả bypassPermissions. Lời gọi Bash khác rơi xuống permission mode.
disallowed_tools=["*"]Mọi định nghĩa tool bị loại khỏi request. Glob cho tên tool được hỗ trợ trong deny rule: "*" khớp mọi tool và "mcp__*" khớp mọi MCP tool trên mọi server.

Allow rule chỉ chấp nhận tool-name glob sau một prefix mcp__<server>__ cố định. Phần server phải không có glob vì rule phải chỉ đích danh một server cụ thể bạn đã cấu hình: mcp__puppeteer__* khớp mọi tool từ server puppeteer, và mcp__github__get_* khớp các tool bắt đầu bằng get_ của nó. Một entry không được neo như allowed_tools=["*"] hoặc allowed_tools=["mcp__*"] bị bỏ qua kèm startup warning và không tự động approve gì cả.

Rule có scope cho ReadEdit nhận một path pattern. Rule Edit(path) chi phối mọi built-in tool ghi file, bao gồm cả WriteNotebookEdit; một rule Write(path) không bao giờ được match bởi các check permission file.

Dùng //path cho một absolute filesystem path: một deny rule Edit(//secrets/**) chặn ghi ở bất kỳ đâu dưới /secrets trên đĩa. Với một dấu slash đầu, Edit(/secrets/**) neo tại nguồn gốc của rule thay vào đó. Với rule truyền qua allowed_tools hoặc disallowed_tools, đó là working directory của session, nên rule này không chặn /secrets trên đĩa. Xem Rule Read và Edit để biết bốn dạng neo và cách rule từ settings file được resolve.

Với một agent bị khoá chặt, kết hợp allowedTools với permissionMode: "dontAsk". Tool có trong danh sách được approve, ngoại trừ các tool luôn-prompt trong Caution ở trên; mọi thứ khác bị deny thẳng thay vì prompt:

const options = {
allowedTools: ["Read", "Glob", "Grep"],
permissionMode: "dontAsk"
};

Bạn cũng có thể cấu hình allow, deny, và ask rule một cách khai báo trong .claude/settings.json. Các rule này được đọc khi setting source project được bật, mặc định là bật với các option query() mặc định. Nếu bạn đặt setting_sources (TypeScript: settingSources) tường minh, hãy bao gồm "project" để chúng áp dụng. Xem Permission settings để biết cú pháp rule.

Permission mode cung cấp kiểm soát toàn cục về cách Claude dùng tool. Bạn có thể đặt permission mode khi gọi query() hoặc thay đổi nó động trong lúc streaming session.

SDK hỗ trợ các permission mode sau:

ModeMô tảHành vi của tool
defaultHành vi permission chuẩnKhông tự động approve; tool không khớp rule nào kích hoạt canUseTool callback của bạn
dontAskDeny thay vì promptBất cứ gì chưa được allowed_tools hoặc rule pre-approve đều bị deny; connector tool tổ chức của bạn đặt thành ask và tool cần tương tác người dùng đều bị deny kể cả khi đã pre-approve. canUseTool không bao giờ được gọi
acceptEditsTự động chấp nhận sửa fileSửa file và thao tác filesystem (mkdir, rm, mv, v.v.) được tự động approve
bypassPermissionsBỏ qua permission checkTool chạy không có permission prompt, trừ tool khớp một ask rule tường minh, connector tool tổ chức của bạn đặt thành ask, và tool cần tương tác người dùng (dùng cẩn thận)
planPlanning modeClaude khám phá và lên plan mà không sửa source file của bạn; sửa file không bao giờ được tự động approve và prompt qua canUseTool callback của bạn
autoApproval phân loại bởi modelMột model classifier approve hoặc deny permission prompt. Xem Auto mode để biết mức độ khả dụng

Bạn có thể đặt permission mode một lần khi bắt đầu một query, hoặc thay đổi nó động trong khi session đang active.

Truyền permission_mode (Python) hoặc permissionMode (TypeScript) khi tạo một query. Mode này áp dụng cho toàn bộ session trừ khi được thay đổi động.

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
async for message in query(
prompt="Help me refactor this code",
options=ClaudeAgentOptions(
permission_mode="default", # Set the mode here
),
):
if hasattr(message, "result"):
print(message.result)
asyncio.run(main())
import { query } from "@anthropic-ai/claude-agent-sdk";
async function main() {
for await (const message of query({
prompt: "Help me refactor this code",
options: {
permissionMode: "default" // Set the mode here
}
})) {
if ("result" in message) {
console.log(message.result);
}
}
}
main();

Gọi set_permission_mode() (Python) hoặc setPermissionMode() (TypeScript) để thay đổi mode giữa session. Mode mới có hiệu lực ngay lập tức cho mọi tool request tiếp theo. Điều này cho phép bạn bắt đầu chặt chẽ rồi nới lỏng permission khi độ tin cậy tăng lên, ví dụ chuyển sang acceptEdits sau khi review cách tiếp cận ban đầu của Claude.

import asyncio
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
async def main():
async with ClaudeSDKClient(
options=ClaudeAgentOptions(
permission_mode="default", # Start in default mode
)
) as client:
await client.query("Help me refactor this code")
# Change mode dynamically mid-session
await client.set_permission_mode("acceptEdits")
# Process messages with the new permission mode
async for message in client.receive_response():
if hasattr(message, "result"):
print(message.result)
asyncio.run(main())
import { query } from "@anthropic-ai/claude-agent-sdk";
async function main() {
const q = query({
prompt: "Help me refactor this code",
options: {
permissionMode: "default" // Start in default mode
}
});
// Change mode dynamically mid-session
await q.setPermissionMode("acceptEdits");
// Process messages with the new permission mode
for await (const message of q) {
if ("result" in message) {
console.log(message.result);
}
}
}
main();

Tự động approve thao tác file để Claude có thể sửa code mà không cần prompt. Tool khác (như lệnh Bash không phải thao tác filesystem) vẫn cần permission bình thường.

Thao tác được tự động approve:

  • Sửa file (tool Edit, Write)
  • Lệnh filesystem: mkdir, touch, rm, rmdir, mv, cp, sed

Cả hai chỉ áp dụng cho path bên trong working directory hoặc additionalDirectories. Path bên ngoài phạm vi đó và ghi vào path được bảo vệ vẫn prompt.

Dùng khi: bạn tin tưởng các sửa đổi của Claude và muốn lặp nhanh hơn, ví dụ khi đang prototype hoặc làm việc trong một thư mục cô lập.

Chuyển mọi permission prompt thành deny. Tool được pre-approve bởi allowed_tools, allow rule trong settings.json, hoặc một hook vẫn chạy bình thường. Connector tool tổ chức của bạn đặt thành ask và tool cần tương tác người dùng bị deny kể cả khi một allow rule khớp. Mọi thứ khác bị deny mà không gọi canUseTool.

Dùng khi: bạn muốn một tool surface cố định, tường minh cho một headless agent và ưu tiên hard deny hơn là dựa ngầm vào việc canUseTool không tồn tại.

Tự động approve mọi lần dùng tool mà không prompt. Hook vẫn thực thi và có thể chặn thao tác nếu cần.

Claude khám phá codebase và tạo một plan mà không sửa source file của bạn. Tool chỉ đọc chạy như trong default mode.

Sửa file không bao giờ được tự động approve trong plan mode, kể cả khi một allow rule khớp. Chúng prompt qua canUseTool callback của bạn thay vào đó. Trên Claude Code v2.1.212 trở lên, lệnh shell sửa file, như touchrm, cũng chạm tới canUseTool callback của bạn theo cách tương tự.

Claude có thể dùng AskUserQuestion để làm rõ yêu cầu trước khi hoàn thiện plan. Xem Xử lý approval và user input để xử lý các prompt này.

Dùng khi: bạn muốn Claude đề xuất thay đổi mà không thực thi chúng, ví dụ khi code review hoặc khi bạn cần approve thay đổi trước khi chúng được thực hiện.

Với các bước khác trong flow đánh giá permission: