Cara Atur Izin Claude Code: Contoh settings.json dan Aturannya
Cara atur izin Claude Code lewat settings.json: file mana yang menang, cara kerja aturan allow, ask, dan deny, kenapa deny menang, dan melindungi .env.
Oleh Matthews WongDitinjau pada Dicek dengan Claude Code v2.1.296
Poin utama
settings.json Claude Code adalah file JSON tempat aturan izin, hooks, dan pengaturan lain disimpan. Lima level bisa mengatur key yang sama dan level tertinggi yang menang, tetapi daftar aturan digabung lintas file. Setiap tool call dicek terhadap deny, lalu ask, lalu allow, dan kecocokan pertama yang memutuskan, jadi aturan deny selalu menang dan tidak bisa dikalahkan allow.
Setelah pelajaran ini, Anda bisa
- Memilih file settings yang tepat untuk sebuah aturan dan memperkirakan nilai mana yang menang.
- Menulis aturan allow, ask, dan deny yang cocok dengan maksud Anda, termasuk wildcard.
- Menjauhkan secret dari jangkauan Claude dengan aturan deny Read, dan tahu di mana batasnya.
Ikuti diagramnya langkah demi langkah
Tekan Putar, atau melangkah dengan panah. Setiap langkah juga ditulis di bawah diagram.
Bagaimana Claude Code memutuskan sebuah tool call boleh jalan
Settings datang dari lima level dan yang tertinggi menang, daftar aturan dari semua file digabung jadi satu set, dan setiap tool call dicek terhadap deny, lalu ask, lalu allow, apa pun mode izinnya.
Ditinjau pada 13 Oktober 2026 · Claude Code v2.1.296
Tombol: ← → langkah · Home / End · K putar atau jeda
Settings datang dari lima level, yang tertinggi di atas. Setiap tool call lalu dicek terhadap aturan gabungan dengan urutan tetap: deny, lalu ask, lalu allow.
Untuk satu nilai, seperti defaultMode, level tertinggi yang mengaturnya yang menang. Di sini plan milik tim mengalahkan acceptEdits pribadi Anda.
"defaultMode": "plan"Tebak langkah berikutnya Bisakah file settings yang lebih tinggi menghapus aturan deny dari file di bawahnya? (Bisa, level yang lebih tinggi menang · Tidak, daftar aturan digabung jadi satu set)Daftar aturan berperilaku lain. Entri allow, ask, dan deny dari semua file digabung jadi satu set, jadi tidak ada file yang bisa menghapus aturan file lain.
git push origin main tidak cocok dengan aturan deny, lalu cocok dengan aturan ask, jadi Claude Code bertanya dulu, walaupun ada aturan allow yang juga cocok.
"ask": ["Bash(git push *)"]Tebak langkah berikutnya Claude mencoba membaca .env. Bagian mana yang menghentikannya? (Aturan deny Read(./.env) · File .claudeignore · Tidak ada: Claude Code bertanya dulu)Membaca .env cocok dengan aturan deny lebih dulu, jadi panggilan diblokir. File .claudeignore tidak berpengaruh, dan tidak ada aturan allow yang bisa mengalahkan deny.
"deny": ["Read(./.env)"]npm run lint lolos dari deny dan ask, lalu cocok dengan Bash(npm run *), jadi langsung jalan tanpa prompt. Di mode Manual, npm install tidak cocok apa pun dan tetap ditanyakan.
"allow": ["Bash(npm run *)"]Shift+Tab berpindah antar mode izin. Mode plan membiarkan Claude membaca dan mengusulkan, tetapi tidak mengedit apa pun sampai Anda setuju. Aturan deny tetap memblokir di semua mode.
claude --permission-mode plan
File settings Claude Code mana yang menang?
Claude Code membaca settings dari empat file, ditambah managed settings dari organisasi Anda. ~/.claude/settings.json milik Anda di semua proyek. .claude/settings.json adalah file proyek bersama yang di-commit agar rekan tim mendapat permission dan hooks yang sama. .claude/settings.local.json hanya milik Anda di proyek ini, dan Claude Code menjauhkannya dari git saat membuat file itu.
Baca selengkapnya (2)Tutup
Jika key yang sama diatur dua kali, level tertinggi yang menang: managed, lalu flag --settings untuk satu sesi, lalu project local, lalu shared project, lalu user. Key berbentuk daftar adalah pengecualian. permissions.allow, ask, dan deny dari semua file digabung, jadi setiap file menambah aturan tanpa menghapus aturan file lain. Jalankan /status untuk melihat file mana yang termuat, dan /permissions untuk melihat setiap aturan beserta file asalnya.
Memilih "Yes, and don't ask again" pada prompt Bash menyimpan aturan allow ke .claude/settings.local.json di root repositori. Persetujuan itu bersifat pribadi: rekan tim tidak pernah melihatnya. Di repo ini, persetujuan tiap kontributor terkumpul di sana, sementara file yang di-commit hanya berisi hal yang dibutuhkan semua orang.
Bagaimana aturan allow, ask, dan deny mencocokkan sebuah tool call?
Sebuah aturan adalah nama tool, bisa ditambah specifier dalam kurung. Bash(npm run build) cocok dengan perintah itu persis, Read(./.env) cocok dengan pembacaan file itu, dan Bash tanpa kurung cocok dengan semua perintah shell. Setiap panggilan dicek terhadap deny dulu, lalu ask, lalu allow, dan kecocokan pertama yang memutuskan. Seberapa spesifik aturannya tidak mengubah urutan, jadi deny yang luas seperti Bash(aws *) tetap memblokir aws s3 ls walaupun Bash(aws s3 ls) di-allow.
Baca selengkapnya (1)Tutup
Di aturan Bash, * cocok dengan teks apa pun, termasuk spasi. Semua yang ada sebelum * pertama menjadi batasnya, jadi letakkan * setelah subcommand: Bash(git log *) hanya mengizinkan git log, sedangkan Bash(git *) mengizinkan semua perintah git, termasuk push. Spasi juga berpengaruh, karena Bash(ls *) tidak cocok dengan lsof. Perintah yang disambung dengan &&, ||, ; atau | dipecah, dan setiap bagian harus cocok sendiri-sendiri, jadi mengizinkan npm run lint tidak diam-diam menyetujui npm run lint && rm -rf dist.
Kenapa .claudeignore tidak melindungi secret Anda?
Masih banyak panduan yang menyarankan menulis daftar secret di file .claudeignore. Dokumentasi menyatakan dengan jelas bahwa file itu tidak berpengaruh. Cara resmi menjauhkan tool file Claude dari sebuah file adalah aturan deny Read, misalnya Read(./.env) dan Read(./.env.*), dan deny Read juga memblokir Edit dan Write pada path yang sama.
Baca selengkapnya (1)Tutup
Pahami batasnya. Aturan deny Read dan Edit mencakup tool file bawaan Claude, perintah file di Bash yang dikenali Claude Code seperti cat dan head, serta redirection. Aturan itu tidak mencakup script Node atau Python yang membuka file sendiri; untuk kasus itu, dokumentasi mengarahkan ke sandbox, yang membatasi akses di level sistem operasi. Kabar baiknya, aturan deny di file proyek yang di-commit langsung berlaku sebelum rekan tim menerima dialog workspace trust, karena sifatnya hanya membatasi, sedangkan aturan allow proyek menunggu trust itu.
Apa yang diubah oleh mode izin Claude Code?
Mode menentukan dasar, dan aturan berlaku di atasnya. Manual, dengan nilai config default, hanya menjalankan pembacaan tanpa bertanya. acceptEdits juga menyetujui edit file dan perintah filesystem umum di direktori kerja. plan membiarkan Claude membaca dan mengusulkan tanpa mengedit sampai Anda menyetujui rencananya. auto berjalan tanpa prompt rutin sementara classifier mengecek aksi di latar belakang. dontAsk menolak semua yang biasanya memunculkan prompt, cocok untuk script yang dikunci, dan bypassPermissions melewati prompt sehingga hanya layak dipakai di container atau VM yang terisolasi.
Baca selengkapnya (1)Tutup
Tekan Shift+Tab untuk berpindah mode selama sesi, atau mulai langsung di satu mode dengan claude --permission-mode plan. permissions.defaultMode menentukan mode awal, tetapi file proyek tidak bisa memulai sesi dalam mode auto atau bypassPermissions; kedua nilai itu hanya berlaku dari settings user atau managed. Aturan deny memblokir di semua mode, termasuk bypassPermissions.
Konfigurasi nyata di balik pelajaran ini
Kutipan dari repositori yang membangun dan men-deploy situs ini, apa adanya.
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "node \"${CLAUDE_PROJECT_DIR:-.}/scripts/review-blog-figures.mjs\" --hook 2>/dev/null || true",
"timeout": 30,
"statusMessage": "Checking whether the figures fit"
}
]
}
]
}
}Seluruh isi file settings bersama di repo ini. Isinya satu hook PostToolUse, yang dibahas di pelajaran 4, dan sama sekali tanpa aturan permission. Semua yang meng-clone repo mendapat pengecekan gambar yang sama setelah setiap Write atau Edit, sementara persetujuan tiap kontributor terkumpul di .claude/settings.local.json yang tidak dilacak git dan tidak pernah di-commit.
# env files (can opt-in for committing if needed)
.env*
!.env.exampleGit menjauhkan semua file env, kecuali contohnya, dari commit. Itu melindungi repositori, bukan sesi. File picker @ memang menyembunyikan file yang di-gitignore secara default, tetapi itu fitur kenyamanan, bukan pengaman: tidak ada apa pun di file settings bersama yang mencegah tool Read Claude membuka .env.
Kesalahan yang benar-benar membuang waktu
Bash(git *) padahal maksudnya git log
Semua yang ada sebelum * pertama itulah yang membatasi aturan, jadi Bash(git *) mengizinkan semua perintah git, termasuk push. Tulis perintah yang Anda maksud dan ganti hanya bagian yang berubah-ubah: Bash(git log *).
Mengira aturan deny bisa menghentikan script
Read(./.env) menghentikan tool file Claude dan cat, tetapi tidak menghentikan script Node atau Python yang membuka file itu sendiri. Untuk batas yang berlaku bagi semua proses, aktifkan sandbox.
Aturan tim ditaruh di settings.local.json
Persetujuan yang Anda berikan di prompt masuk ke file lokal, yang hanya Anda miliki. Jika seluruh tim butuh sebuah aturan, tambahkan ke .claude/settings.json lalu commit.
Aturan allow yang di-commit seolah diabaikan
Aturan allow proyek baru berlaku setelah tiap orang menerima dialog workspace trust. Proses claude -p tidak pernah menampilkan dialog itu, jadi aturan allow tidak berlaku di sana sama sekali. Aturan deny dan ask langsung berlaku.
Yang akan saya ubah di sini: belum ada deny Read untuk file env
Repo ini menyimpan API key di file env lokal, dan file settings bersamanya belum punya aturan deny untuk file itu. Menambahkan Read(./.env) dan Read(./.env.*) ke permissions.deny di .claude/settings.json akan melindungi setiap kontributor sejak sesi pertama, bahkan sebelum dialog trust muncul.
| ~/.claude/settings.json | .claude/settings.json | .claude/settings.local.json | Managed settings | |
|---|---|---|---|---|
| Siapa yang terkena | Anda, di semua proyek | Semua yang bekerja di repo | Anda, hanya di repo ini | Semua yang menerima dari organisasi |
| Masuk git? | Tidak | Ya: commit file ini | Tidak: Claude Code menjauhkannya | Tidak: dipasang tim IT |
| Dipakai untuk | Preferensi dan aturan pribadi | Permission, hooks, dan plugin tim | Override pribadi dan persetujuan tersimpan | Kebijakan keamanan yang tidak bisa ditimpa |
Lakukan di komputer Anda sendiri
Anda butuh Claude Code, Node, dan satu folder kosong. Lima belas menit, dengan secret palsu, di repo coba-coba yang bisa dihapus sesudahnya.
Buat repo coba-coba berisi script lint dan secret palsu.
mkdir perm-lab && cd perm-lab && git init npm init -y npm pkg set scripts.lint="echo lint ok" echo "DEMO_TOKEN=not-a-real-secret" > .envBuat .claude/settings.json dengan satu aturan untuk tiap jenis.
{ "permissions": { "allow": ["Bash(npm run *)"], "ask": ["Bash(git push *)"], "deny": ["Read(./.env)"] } }Jalankan Claude Code dan terima dialog trust. Minta Claude menjalankan script lint, melakukan push, dan menampilkan isi .env. Satu jalan tanpa tanya, satu memunculkan prompt (tolak saja), dan satu ditolak.
claudeJalankan /permissions untuk melihat setiap aturan beserta file asalnya, dan /status untuk membaca baris Setting sources.
/permissions /statusSetujui perintah Bash lain dengan "Yes, and don't ask again", lalu buka file lokal dan temukan aturan yang tersimpan.
cat .claude/settings.local.jsonAwali satu prompt dengan /plan, baca rencana yang diusulkan Claude, dan perhatikan bahwa tidak ada file yang berubah sampai Anda menyetujuinya.
/plan add a health-check script
Tiga pertanyaan sebelum lanjut
Pilih jawaban untuk melihat kenapa benar atau salah. Tidak ada yang disimpan atau dinilai, jadi tebak saja dengan bebas.
Jawab dalam hati, lalu cek
1.Anda meng-allow Bash(aws s3 ls) dan men-deny Bash(aws *). Apakah aws s3 ls jalan?Lihat jawabannya
Jawaban:Tidak. Deny dicek lebih dulu dan kecocokan pertama yang memutuskan; aturan allow yang lebih spesifik tidak bisa membuat pengecualian dari deny.
2.Rekan tim meng-clone repo dengan aturan allow yang sudah Anda commit, tetapi tetap mendapat prompt. Kenapa?Lihat jawabannya
Jawaban:Aturan allow proyek menunggu sampai orang itu menerima dialog workspace trust. Proses claude -p tidak pernah menampilkan dialog itu, jadi aturan allow juga tidak berlaku di sana.
3.Cukupkah menambahkan .env ke file .claudeignore?Lihat jawabannya
Jawaban:Tidak. File itu tidak berpengaruh. Pakai aturan deny Read(./.env), dan sandbox untuk script yang membuka file sendiri.
4..claude/settings.json milik tim mengatur defaultMode ke plan, sedangkan file user Anda mengatur acceptEdits. Sesi di repo itu dimulai dalam mode apa?Lihat jawabannya
Jawaban:Plan. Settings proyek bersama berada di atas settings user, jadi nilai milik tim yang menang. Untuk mengubahnya hanya bagi Anda, atur di .claude/settings.local.json.
Bahasan mendalam terkait di situs ini
Sumber
Sumber primer yang diperiksa pada tanggal riset. Ikuti tautannya untuk versi terbaru.
- Dokumentasi Claude Code: file settings dan siapa yang terkena
- Dokumentasi Claude Code: urutan prioritas settings
- Dokumentasi Claude Code: daftar digabung, bukan ditimpa
- Dokumentasi Claude Code: mengelola izin (deny, ask, allow)
- Dokumentasi Claude Code: pola wildcard
- Dokumentasi Claude Code: aturan Read dan Edit
- Dokumentasi Claude Code: aturan allow proyek dan workspace trust
- Dokumentasi Claude Code: mode izin yang tersedia
- Dokumentasi Claude Code: respectGitignore dan file picker @
- Dokumentasi Claude Code berbahasa Indonesia: konfigurasi izin