Skip to main content
Tips Claude Code · Pelajaran 2 dari 6 · 12 menit

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.
Lihat cara kerjanya

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

Langkah 1 dari 7. 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.

Tombol: ← → langkah · Home / End · K putar atau jeda

  1. 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.

  2. 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)
  3. 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.

  4. 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)
  5. 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)"]
  6. 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 *)"]
  7. 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)

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)

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)

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)

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.

Cara situs ini melakukannya

Konfigurasi nyata di balik pelajaran ini

Kutipan dari repositori yang membangun dan men-deploy situs ini, apa adanya.

.claude/settings.json:1-17
{
  "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.

.gitignore:33-35
# env files (can opt-in for committing if needed)
.env*
!.env.example

Git 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.

Yang sering rusak

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.

File settings mana yang tepat untuk sebuah aturan
Siapa yang terkenaAnda, di semua proyekSemua yang bekerja di repoAnda, hanya di repo iniSemua yang menerima dari organisasi
Masuk git?TidakYa: commit file iniTidak: Claude Code menjauhkannyaTidak: dipasang tim IT
Dipakai untukPreferensi dan aturan pribadiPermission, hooks, dan plugin timOverride pribadi dan persetujuan tersimpanKebijakan keamanan yang tidak bisa ditimpa
Coba sendiri

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.

  1. 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" > .env
  2. Buat .claude/settings.json dengan satu aturan untuk tiap jenis.

    {
      "permissions": {
        "allow": ["Bash(npm run *)"],
        "ask": ["Bash(git push *)"],
        "deny": ["Read(./.env)"]
      }
    }
  3. 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.

    claude
  4. Jalankan /permissions untuk melihat setiap aturan beserta file asalnya, dan /status untuk membaca baris Setting sources.

    /permissions
    /status
  5. Setujui perintah Bash lain dengan "Yes, and don't ask again", lalu buka file lokal dan temukan aturan yang tersimpan.

    cat .claude/settings.local.json
  6. Awali 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
Kuis singkat

Tiga pertanyaan sebelum lanjut

Pilih jawaban untuk melihat kenapa benar atau salah. Tidak ada yang disimpan atau dinilai, jadi tebak saja dengan bebas.

  1. 1.Anda meng-allow Bash(git *) supaya Claude bisa membaca riwayat lewat git log tanpa bertanya. Apa lagi yang ikut Anda setujui?
  2. 2..claude/settings.json milik tim men-deny Bash(rm *). settings.local.json Anda, yang levelnya lebih tinggi, meng-allow Bash(rm -rf dist). Claude menjalankan rm -rf dist. Apa yang terjadi?
  3. 3.Anda men-deny Read(./.env). Claude menulis script Node yang membuka .env sendiri, dan Anda menyetujui script itu dijalankan. Apakah aturan deny menghentikannya?
Pikirkan dulu

Jawab dalam hati, lalu cek

  1. 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. 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. 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. 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.

Pelajari lebih dalam

Bahasan mendalam terkait di situs ini