Bayangkan kamu punya aplikasi web — dan tiba-tiba pengguna biasa bisa menghapus data milik orang lain. Serem, kan? Ini bukan sekadar bug, ini celah keamanan serius. Nah, di sinilah otorisasi berperan. Kalau kamu sudah familiar dengan autentikasi Laravel Breeze untuk proses login, saatnya naik level: kita bahas bagaimana Laravel mengontrol siapa boleh melakukan apa setelah pengguna berhasil masuk.
Di artikel ke-23 dari seri 50 Artikel Belajar Laravel ini, kita akan bedah tuntas dua senjata utama Laravel untuk otorisasi: Gates dan Policies. Kamu akan paham kapan memakai yang mana, cara implementasinya, dan bagaimana mengintegrasikannya ke Blade template serta controller. Siap? Mari mulai!
🔐 Autentikasi vs Otorisasi: Jangan Sampai Ketukar!
Banyak developer — terutama yang baru kelar setup autentikasi Laravel Breeze — mengira pekerjaan keamanan sudah selesai begitu login berjalan. Padahal, autentikasi baru separuh cerita.
Analoginya begini: autentikasi adalah petugas pintu masuk yang ngecek KTP kamu. Tapi setelah masuk gedung, bukan berarti kamu bisa masuk ke semua ruangan, kan? Nah, otorisasi adalah satpam yang jagain tiap ruangan — memastikan kamu hanya masuk ke tempat yang memang jadi hakmu.
| Aspek | 🔑 Autentikasi | 🛡️ Otorisasi |
|---|---|---|
| Pertanyaan utama | Siapa kamu? | Apa yang boleh kamu lakukan? |
| Tool Laravel | Breeze, Jetstream, Sanctum | Gates & Policies |
| Contoh aksi | Login, register, logout | Edit post, hapus user, lihat dashboard |
| Kapan dicek? | Saat masuk aplikasi | Saat mengakses fitur/resource tertentu |
Selalu setup autentikasi dulu sebelum otorisasi. Gunakan php artisan breeze:install untuk scaffolding autentikasi Laravel Breeze yang cepat, lalu lanjutkan dengan Gates dan Policies untuk kontrol akses yang lebih granular.
⚡ Gates: Si Penjaga Simpel yang Powerful
Gates adalah cara paling straightforward untuk mendefinisikan otorisasi di Laravel. Bayangkan Gates seperti daftar tamu VIP di sebuah acara — kamu cukup tulis "siapa boleh masuk" dalam satu baris kode, dan Laravel yang akan ngecek setiap kali dibutuhkan.
Gates didefinisikan di dalam AuthServiceProvider menggunakan method Gate::define(). Berikut langkah-langkahnya:
Temukan file di app/Providers/AuthServiceProvider.php. Di sinilah semua Gates kamu didaftarkan dalam method boot().
Ada tiga cara memanggil Gate: allows(), denies(), atau authorize() yang otomatis throw exception 403.
Directive Blade @can dan @cannot membuat view jadi bersih dan readable.
Gates ideal untuk aturan otorisasi yang sederhana dan tidak terikat model tertentu. Misalnya: "apakah user ini admin?", "bolehkah akses halaman pengaturan?". Kalau logika mulai kompleks dan terikat ke model Eloquent, saatnya beralih ke Policies.
🏛️ Policies: Otorisasi yang Terstruktur dan Elegan
Kalau Gates itu seperti catatan tempel di kulkas, maka Policies adalah buku peraturan lengkap yang tersusun rapi per bab. Policies adalah class PHP khusus yang mengelompokkan semua logika otorisasi untuk satu model Eloquent. Ini adalah pendekatan yang direkomendasikan untuk aplikasi skala menengah ke atas.
Laravel menyediakan artisan command untuk generate Policy secara otomatis, termasuk method standar CRUD yang siap diisi.
Jalankan command berikut di terminal untuk membuat Policy baru. Flag --model otomatis mengisi method CRUD standar.
Setiap method di Policy menerima user dan model sebagai parameter, lalu mengembalikan true (izin) atau false (tolak).
Hubungkan model ke Policy-nya di array $policies. Laravel 11 ke atas melakukan auto-discovery, tapi mendaftarkannya secara eksplisit lebih aman.
Method $this->authorize() di controller secara otomatis memanggil Policy yang sesuai.
Method authorizeResource() di constructor controller secara ajaib memetakan 7 method CRUD (index, create, store, show, edit, update, destroy) ke Policy yang sesuai — hanya dengan satu baris kode! Ini salah satu fitur yang bikin Laravel sangat produktif dibanding framework lain.
🤔 Gates vs Policies: Panduan Memilih yang Tepat
Setelah menguasai keduanya — seperti yang sudah kamu pelajari di seri ini mulai dari setup autentikasi Laravel Breeze hingga middleware — pertanyaan berikutnya adalah: kapan harus pakai Gates, dan kapan Policies lebih cocok?
- Aturan sederhana & tidak terkait model
- Cek global seperti "apakah admin?"
- Otorisasi lintas resource
- Prototype cepat atau aplikasi kecil
- Logika yang hanya muncul 1-2 tempat
- Aturan terkait model Eloquent tertentu
- Banyak action berbeda untuk 1 resource
- Tim besar dengan banyak developer
- Aplikasi skala menengah ke atas
- Butuh organisasi kode yang bersih
Jangan lupa: Gate dan Policy hanya menyembunyikan UI di Blade template, tapi kamu harus tetap cek otorisasi di controller/backend! Banyak developer junior yang cuma pakai @can di Blade tapi lupa $this->authorize() di controller — ini celah keamanan!
Gunakan Gate::before() untuk memberikan akses penuh ke super admin tanpa harus modifikasi setiap Policy satu per satu:
Gate::before(function (User $user, string $ability) {
if ($user->role === 'super-admin') {
return true; // Skip semua cek lainnya
}
});
Artikel ini adalah bagian dari Seri Belajar Laravel Lengkap — 50 Artikel. Ikuti semua artikel untuk menjadi Laravel developer yang handal! 🚀
No comments:
Post a Comment