Authentication menjawab pertanyaan “siapa kamu” — login, password, session. Authorization menjawab pertanyaan yang berbeda: “apa yang boleh kamu lakukan setelah terbukti siapa kamu”. Siti bisa saja berhasil login dengan benar, tetapi login saja tidak memberi Siti hak untuk mengedit tulisan milik Budi. Pada chapter ini kita memetakan cara Laravel menjawab pertanyaan kedua tersebut: sebuah sistem pemeriksaan terpusat bernama Gate yang bisa kita isi dengan dua gaya penulisan — closure singkat (gate) atau class per model (policy). Seluruh section ini dibangun di atas dua gaya tersebut, jadi memahami peta ini akan membuat delapan chapter berikutnya terasa ringan.

Authentication Bukan Authorization #

Kedua istilah ini sering tertukar karena sama-sama berawalan “auth”. Authentication adalah proses memverifikasi identitas, sedangkan authorization adalah proses memverifikasi hak. Prosesnya berurutan: pengguna harus lulus authentication lebih dulu, baru pemeriksaan authorization berarti. Perhatikan perbandingan berikut:

AspekAuthenticationAuthorization
PertanyaanSiapa kamu?Apa yang boleh kamu lakukan?
Masalah umumLogin gagal, session habis403 Forbidden, tombol tersembunyi
Terkait userIdentitas (id, email)Hak akses (role, kepemilikan)
Dibahas diSection AuthenticationSection ini

Contoh nyatanya mudah ditemui: aplikasi blog mengizinkan semua pengguna terdaftar membaca semua tulisan, tetapi hanya pemilik tulisan yang boleh mengubahnya. Pemilikan (user_id) adalah salah satu sumber authorization paling umum, di samping role seperti admin atau editor. Kita sudah melihat perbedaan konseptualnya di authentication vs authorization ; sekarang kita masuk ke sisi Laravel.

Empat Titik Pemeriksaan #

Laravel menyediakan satu mekanisme inti — Gate — yang bisa dipanggil dari banyak tempat. Menurut dokumentasi resmi authorization , kita bisa memeriksa hak akses di empat titik:

TitikBentukTempat menulis kode
GateGate::allows() / Gate::authorize()Closure di service provider
PolicyMethod class seperti update()app/Policies/NamaPolicy.php
Middlewarecan:update,postRoute atau controller
Blade@can('update', $post)File .blade.php

Middleware dan Blade bukan sistem terpisah — keduanya hanyalah pintu yang pada akhirnya bertanya ke Gate. Begitu pula method $user->can() pada model User: panggilan tersebut diteruskan ke Gate::forUser($user). Satu sumber kebenaran, banyak titik akses.

Gate dan Policy sebagai Pembungkus Callback #

Inilah rahasia yang membuat dua istilah itu sebenarnya satu model. Sebuah gate adalah closure yang kita daftarkan langsung ke Gate:

php
use Illuminate\Support\Facades\Gate;

Gate::define('edit-settings', function (User $user): bool {
    return $user->role === 'admin';
});

Sebuah policy adalah kumpulan closure serupa, hanya saja closure-nya ditulis sebagai method dalam class khusus untuk satu model — App\Policies\PostPolicy untuk App\Models\Post:

php
class PostPolicy
{
    public function update(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }
}

Method update di atas terdaftar sebagai ability bernama update untuk model Post. Laravel menyembunyikan langkah pendaftaran ini lewat konvensi penamaan (auto-discovery), jadi kita jarang menuliskannya secara eksplisit. Ketika sebuah request ditolak, alurnya singkat dan sama untuk semua titik pemeriksaan: Gate mengevaluasi callback, callback mengembalikan false, exception authorization dilempar, dan pengguna menerima respons 403. Tidak ada konfigurasi tambahan yang harus diaktifkan — sistem ini aktif begitu aplikasi Laravel berdiri, tinggal menunggu kita mengisi aturannya.

Memilih Antara Gate dan Policy #

Pilihan keduanya bukan soal mana yang lebih kuat, melainkan soal cakupan. Gate cocok untuk ability yang berdiri sendiri dan tidak menempel pada satu model — “bolehkah membuka halaman pengaturan”, “bolehkah mengekspor laporan”. Policy cocok ketika pemeriksaan selalu berbicara tentang satu model tertentu — “bolehkah pengguna ini mengubah Post ini”. Karena policy berbentuk class, policy juga lebih rapi saat aturan per model mulai bertambah: setiap method (view, create, update, delete) membawa satu pertanyaan yang jelas. Di chapter berikutnya kita mulai dari bentuk yang paling ringkas: mendefinisikan gate dan memanggilnya dari mana saja.