Apa Itu Policy dan Gate di Laravel 12: Sistem Otorisasi yang Tepat
Bayangkan ada dua pertanyaan berbeda soal keamanan di aplikasi Anda: “Apakah user ini boleh edit artikel?” dan “Apakah user yang login adalah editor?”
Pertanyaan pertama terkait Policy: otorisasi berdasarkan resource. Pertanyaan kedua terkait Gate: otorisasi berdasarkan kemampuan/role. Keduanya bagian dari sistem Authorization di Laravel.
Apa Itu Gate?
Gate adalah cara mendefinisikan otorisasi berbasis kemampuan (ability) secara sederhana, biasanya untuk aksi yang tidak terkait langsung dengan model tertentu.
Definisikan Gate di app/Providers/AppServiceProvider.php:
<?php
namespace AppProviders;
use AppModelsUser;
use IlluminateSupportFacadesGate;
use IlluminateSupportServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
Gate::define('access-admin-panel', function (User $user) {
return $user->role === 'admin';
});
Gate::define('manage-settings', function (User $user) {
return in_array($user->role, ['admin', 'superadmin']);
});
}
}
Gunakan di controller atau view:
// Di controller
if (Gate::denies('access-admin-panel')) {
abort(403);
}
// Dengan authorize (auto-throw 403 jika gagal)
Gate::authorize('access-admin-panel');
// Di Blade
@can('access-admin-panel')
<a href="/admin">Admin Panel</a>
@endcan
Apa Itu Policy?
Policy adalah kelas yang mengelompokkan logika otorisasi untuk satu model. Cocok untuk otorisasi seperti “siapa yang boleh edit, hapus, atau lihat resource ini?”
php artisan make:policy ArticlePolicy --model=Article
File dibuat di app/Policies/ArticlePolicy.php:
<?php
namespace AppPolicies;
use AppModelsArticle;
use AppModelsUser;
class ArticlePolicy
{
public function viewAny(User $user): bool
{
return true; // Semua user bisa lihat daftar artikel
}
public function view(User $user, Article $article): bool
{
// Bisa lihat kalau published, atau kalau milik sendiri
return $article->status === 'published' || $article->user_id === $user->id;
}
public function create(User $user): bool
{
return $user->hasVerifiedEmail();
}
public function update(User $user, Article $article): bool
{
// Hanya pemilik yang bisa edit
return $article->user_id === $user->id;
}
public function delete(User $user, Article $article): bool
{
// Pemilik dan admin bisa hapus
return $article->user_id === $user->id || $user->role === 'admin';
}
}
Registrasi Policy
Di Laravel 12, policy otomatis ditemukan (auto-discovery) kalau struktur folder sesuai konvensi. Tapi Anda juga bisa register manual di AppServiceProvider:
use AppModelsArticle;
use AppPoliciesArticlePolicy;
use IlluminateSupportFacadesGate;
Gate::policy(Article::class, ArticlePolicy::class);
Menggunakan Policy
// Di controller
public function edit(Article $article)
{
$this->authorize('update', $article); // Throw 403 kalau tidak bisa
return view('articles.edit', compact('article'));
}
// Cek tanpa throw exception
if ($request->user()->can('update', $article)) {
// boleh lanjut
}
// Di Blade
@can('update', $article)
<a href="{{ route('articles.edit', $article) }}">Edit</a>
@endcan
@cannot('delete', $article)
<p>Anda tidak bisa hapus artikel ini.</p>
@endcannot
Gate vs Policy: Kapan Pakai Yang Mana?
| Kondisi | Gunakan |
|---|---|
| Otorisasi terkait satu model (Article, Order, dll.) | Policy |
| Otorisasi berdasarkan role/kemampuan global | Gate |
| Aturan sederhana yang tidak butuh kelas terpisah | Gate |
| Banyak aturan berbeda untuk satu model | Policy |
Baca Juga
- Contoh Implementasi Policy dan Gate di Laravel 12: Studi Kasus Lengkap
- Apa Itu Observer di Laravel 12 dan Kapan Menggunakannya
Butuh tim yang bantu implementasi sistem otorisasi yang aman di aplikasi Laravel? Lihat layanan pengembangan aplikasi kami.
Artikel Lainnya di Kategori Laravel
10 November 2025
Apa Itu Observer di Laravel 12 dan Kapan Menggunakannya
Kalau Event dan Listener cocok untuk “sesuatu terjadi di aplikasi, beri tahu komponen lain”, Observer punya fokus berbeda: “ketika Eloquent model berubah, jalankan kode ini.” Artikel ini menjelaskan apa itu Observer di Laravel 12, perbedaannya dengan Event Listener, dan kapan sebaiknya dipakai. Apa Itu Observer? Observer adalah kelas yang merespons event lifecycle Eloquent model: saat […]
Baca Artikel9 November 2025
Perbedaan Laravel Volt dan Laravel Breeze: Kapan Pakai Yang Mana?
Saat mulai proyek Laravel baru, salah satu pertanyaan yang sering muncul adalah: pakai Breeze atau Volt? Keduanya dari ekosistem Laravel, tapi perannya sangat berbeda. Artikel ini menjelaskan perbedaan Laravel Volt dan Laravel Breeze, bukan untuk memilih yang “lebih baik”, tapi untuk memahami kapan masing-masing dipakai. Laravel Breeze: Starter Kit Autentikasi Laravel Breeze adalah starter kit […]
Baca Artikel10 November 2025
Contoh Penggunaan Contract di Laravel 12: Implementasi dan Binding
Kalau Anda sudah membaca artikel tentang apa itu Contract di Laravel 12, artikel ini melanjutkannya dengan contoh penggunaan nyata: bagaimana membuat implementasi Contract sendiri dan kapan ini berguna dalam proyek. Menggunakan Contract Bawaan Laravel Contract bawaan Laravel ada di namespace Illuminate\Contracts\*. Contoh yang paling sering dipakai adalah type-hinting di constructor untuk decoupling: <?php namespace App\Services; […]
Baca ArtikelIngin Membaca Artikel Lainnya?
Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.
Lihat Semua Artikel