Bayangin kamu sedang bangun aplikasi manajemen kampus. Ada mahasiswa, ada dosen, ada admin. Semua login pakai sistem yang sama — tapi masak admin bisa ikut hapus nilai dosen? Atau mahasiswa bisa akses panel keuangan? Nah, di sinilah autentikasi Laravel Breeze saja tidak cukup. Kamu butuh yang namanya Role dan Permission — sistem penjaga pintu yang memastikan setiap pengguna hanya bisa mengakses apa yang memang menjadi haknya.
Di artikel ke-24 dari seri 50 Artikel Belajar Laravel ini, kita akan bedah tuntas cara kerja Role & Permission di Laravel — mulai dari konsep dasarnya, implementasi manual, hingga menggunakan package Spatie Laravel Permission yang sudah jadi standar industri. Siap? Kunci pintunya dulu, baru kita mulai! 🔐
Role vs Permission — Apa Bedanya?
Role adalah kelompok/jabatan pengguna (misalnya: Admin, Editor, User biasa). Permission adalah izin spesifik yang boleh dilakukan (misalnya: edit-post, delete-user, view-report). Satu Role bisa punya banyak Permission. Intinya: Role = siapa kamu, Permission = apa yang boleh kamu lakukan.
🏛️ Memahami Konsep Role & Permission dengan Analogi Nyata
Coba bayangkan sebuah gedung kantor besar. Di sana ada berbagai jenis kartu akses:
- Kartu Merah (Admin) — bisa masuk ke semua ruangan, termasuk server room dan brankas
- Kartu Kuning (Editor) — bisa masuk ruang konten, tapi tidak ke ruang keuangan
- Kartu Hijau (User) — hanya bisa masuk lobi dan meja kerja sendiri
Nah, Role itu seperti warna kartu — mengelompokkan siapa kamu. Sedangkan Permission adalah daftar ruangan spesifik yang bisa kamu masuki. Itulah inti dari sistem otorisasi berbasis peran (Role-Based Access Control / RBAC) yang akan kita implementasikan dengan autentikasi Laravel Breeze sebagai pondasinya.
Lebih dari 75% insiden kebocoran data di aplikasi web terjadi bukan karena sistem enkripsi yang lemah, melainkan karena kontrol akses yang tidak proper. Membangun Role & Permission yang baik bukan sekadar fitur — ini adalah pertahanan pertamamu!
🚀 Implementasi dengan Spatie Laravel Permission + Autentikasi Laravel Breeze
Package Spatie Laravel Permission adalah solusi paling populer dan terpercaya untuk manajemen role di Laravel — sudah diunduh lebih dari 20 juta kali! Ini adalah fondasi yang sempurna untuk dikombinasikan dengan sistem autentikasi Laravel Breeze yang sudah kamu pasang. Mari kita mulai langkah demi langkah.
Install Package Spatie
Pastikan kamu sudah punya project Laravel dengan autentikasi Laravel Breeze terpasang. Lalu jalankan perintah berikut di terminal:
composer require spatie/laravel-permission
# Publish konfigurasi dan migration
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
# Jalankan migration
php artisan migrate
Tambahkan Trait ke Model User
Buka file app/Models/User.php dan tambahkan trait HasRoles:
namespace App\Models;
use Spatie\Permission\Traits\HasRoles; // ← Tambahkan ini
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasRoles; // ← Gunakan trait di sini
// ... kode lainnya
}
Buat Seeder untuk Role & Permission
Jangan input role secara manual — gunakan Seeder agar mudah di-reset dan di-deploy ulang:
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
class RolePermissionSeeder extends Seeder
{
public function run()
{
// Buat permissions
$permissions = ['manage-users', 'edit-post', 'delete-post', 'view-report'];
foreach ($permissions as $perm) {
Permission::create(['name' => $perm]);
}
// Buat role dan assign permission
$admin = Role::create(['name' => 'admin']);
$admin->givePermissionTo(Permission::all());
$editor = Role::create(['name' => 'editor']);
$editor->givePermissionTo(['edit-post']);
}
}
Assign Role ke User
Setelah role tersedia, kamu bisa assign ke user dengan mudah:
// Assign role ke user
$user->assignRole('admin');
// Cek apakah user punya role tertentu
$user->hasRole('admin'); // true / false
// Cek apakah user punya permission
$user->can('edit-post'); // true / false
Selalu jalankan php artisan permission:cache-reset setelah mengubah data role atau permission. Spatie menyimpan cache-nya sendiri, dan jika lupa reset, perubahan tidak akan langsung terasa di aplikasi!
🛡️ Menerapkan Autentikasi Laravel Breeze dengan Middleware & Blade Directive
Setelah role dan permission terdefinisi, saatnya kita "pasang pagar" di dua titik penting: route (backend) dan tampilan Blade (frontend). Ini yang membuat sistem autentikasi Laravel Breeze-mu benar-benar aman dari dua sisi sekaligus.
Proteksi Route dengan Middleware Role
Spatie otomatis mendaftarkan middleware role dan permission. Gunakan langsung di file routes:
// Hanya admin yang bisa akses
Route::middleware(['auth', 'role:admin'])->group(function() {
Route::get('/admin/dashboard', [AdminController::class, 'index']);
Route::resource('/users', UserController::class);
});
// Hanya editor yang bisa akses
Route::middleware(['auth', 'role:editor'])->group(function() {
Route::get('/posts/create', [PostController::class, 'create']);
});
// Berdasarkan permission spesifik
Route::middleware(['auth', 'permission:delete-post'])->group(function() {
Route::delete('/posts/{id}', [PostController::class, 'destroy']);
});
Sembunyikan Elemen UI dengan Blade Directive
Proteksi route saja tidak cukup — kamu juga harus sembunyikan tombol dan menu yang tidak relevan untuk role tertentu. Spatie menyediakan directive Blade yang sangat elegan:
<!-- Tampil hanya untuk admin -->
@role('admin')
<a href="/admin/users">Kelola Users</a>
@endrole
<!-- Berdasarkan permission -->
@can('edit-post')
<button>Edit Artikel</button>
@endcan
<!-- Tampil untuk multiple role -->
@hasanyrole('admin|editor')
<div>Menu Konten</div>
@endhasanyrole
Jangan hanya proteksi tampilan Blade saja! Menyembunyikan tombol di UI adalah pengalaman pengguna yang baik, tapi bukan keamanan sungguhan. Orang yang tahu URL bisa tetap akses langsung. Selalu proteksi di dua lapisan: Middleware (route) dan Blade (UI).
📊 Perbandingan: Manual vs Spatie untuk Autentikasi Laravel Breeze
Banyak yang bertanya: "Kenapa tidak bikin sendiri saja?" Pertanyaan bagus! Mari kita bandingkan agar kamu bisa pilih pendekatan yang paling tepat untuk proyekmu.
Jangan lupakan untuk mendaftarkan PermissionServiceProvider jika kamu menggunakan Laravel versi lebih lama dari 11. Di Laravel 11+, ini sudah otomatis via package auto-discovery. Cek versi Laravel-mu dengan php artisan --version sebelum mulai!
Artikel ini adalah bagian dari 50 Artikel Belajar Laravel. Sistem Role & Permission yang kamu pelajari di sini bekerja berdampingan dengan Gates & Policies (Artikel 23) dan autentikasi yang sudah kamu setup di awal seri. Semakin jauh kamu baca, semakin utuh skill Laravel-mu! 🚀
No comments:
Post a Comment