Roles, Permission & Filament Shield
Dokumen ini menjelaskan cara kerja sistem otorisasi berbasis role dan permission di starter kit ini, mencakup:
- Konsep dasar Role & Permission
- Konfigurasi Filament Shield
- Hak istimewa Super Admin
- Strategi seeder yang profesional
Konsep Dasar untuk Pemula
Sebelum masuk ke teknis, pahami dua istilah ini:
- Role: peran atau jabatan seseorang, misalnya
Admin,Editor,Member - Permission: aksi yang boleh dilakukan oleh role tersebut, misalnya
view user,delete post, atauupdate order
Cara Membayangkannya
- Role = siapa dia
- Permission = apa yang boleh dia lakukan
Kalau Anda paham dua hal ini, sisanya akan jauh lebih mudah.
Apa Itu Filament Shield
Filament Shield adalah package yang memudahkan kita mengelola Role dan Permission di aplikasi Filament. Package ini dibangun di atas Spatie Permission.
Di starter kit ini, Filament Shield berperan penting karena saya ingin sistem admin panel tidak berhenti hanya di level "bisa login", tetapi juga jelas siapa boleh melakukan apa.
Kenapa Saya Memakai Filament Shield
Karena saya tidak ingin mengelola permission secara manual satu per satu untuk setiap resource baru.
Begitu aplikasi mulai punya:
- banyak resource
- banyak halaman custom
- beberapa widget
- beberapa role
mengelola authorization secara manual akan cepat melelahkan. Filament Shield membantu mengotomatisasi bagian yang repetitif.
Setup Dasar
1. HasRoles Trait
Pastikan model User memiliki kemampuan mengelola role:
// app/Models/User.php
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasRoles; // Wajib ditambahkan!
}
Kalau trait ini tidak ada, sistem role dan permission tidak akan bekerja sebagaimana mestinya.
2. Deteksi Otomatis Permission
Setiap kali Anda membuat Resource baru, misalnya ProductResource, Shield dapat menyiapkan izin standar seperti:
view_anycreateupdatedelete
Ini membantu Anda tidak mulai dari nol setiap kali ada modul baru.
Jalankan perintah
php artisan shield:generate --alluntuk menyinkronkan Resource baru ke dalam database agar permission-nya muncul di halaman kelola role.
Pengaturan di filament-shield.php
Beberapa pengaturan penting yang perlu Anda tahu:
super_admin: peran tertinggi yang punya akses ke mana sajapanel_user: peran dasar bagi siapa saja yang boleh masuk ke dashboard Filamentexclude: daftar Resource atau Page yang tidak ingin Anda beri pembatasan akses
Secara default, aplikasi ini menggunakan gaya penulisan PascalCase untuk permission, misalnya ViewAnyUser, tetapi ini bisa diubah di file konfigurasi jika Anda memang punya konvensi lain.
Hak Istimewa Super Admin
"Super Admin" adalah peran yang punya kunci ke semua pintu. Dalam banyak project, kita tidak perlu memberikan permission satu per satu padanya.
Pengaturan Gate::before
Gunakan Gate::before di AppServiceProvider agar Super Admin otomatis lolos di semua pengecekan authorization:
// app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Gate;
public function boot(): void
{
// Jika user punya role 'super_admin', berikan akses langsung
Gate::before(function ($user, $ability) {
return $user->hasRole('super_admin') ? true : null;
});
}
Kenapa Mengembalikan null (Bukan false)
Ini penting untuk developer pemula:
trueberarti "izinkan"falseberarti "tolak"nullberarti "lanjutkan pengecekan normal"
Jangan kembalikan false untuk user non-super-admin, karena itu justru akan memblokir user lain sebelum policy normal dijalankan.
Strategi Seeder yang Efektif
Kapan pun Anda menjalankan php artisan migrate:fresh --seed, Anda ingin Role dan Permission kembali tersedia seperti semula.
Kalau role dan permission hanya dibuat manual lewat dashboard tanpa seeder, maka:
- environment baru sulit disamakan
- onboarding developer baru lebih lambat
- setup ulang database menjadi merepotkan
Sinkronisasi Otomatis
Gunakan perintah ini untuk memastikan Resource terbaru masuk ke database permission:
php artisan shield:generate --all
Seeder yang Profesional
Buat seeder yang menangani:
- membersihkan cache permission
- generate permission terbaru
- membuat role dasar
- memberikan role ke user awal
Contoh:
// database/seeders/ShieldSeeder.php
use Spatie\Permission\Models\Role;
use Spatie\Permission\PermissionRegistrar;
public function run(): void
{
// 1. Bersihkan cache permission agar tidak bentrok
app()[PermissionRegistrar::class]->forgetCachedPermissions();
// 2. Jalankan perintah shield untuk isi data permission
$this->command->call('shield:generate', ['--all' => true]);
// 3. Buat Peran (Role) jika belum ada
$superAdmin = Role::firstOrCreate(['name' => 'super_admin', 'guard_name' => 'web']);
$panelUser = Role::firstOrCreate(['name' => 'panel_user', 'guard_name' => 'web']);
// 4. Berikan Peran ke User Utama
$user = \App\Models\User::firstWhere('email', '[email protected]');
$user?->assignRole($superAdmin);
}
Studi Kasus
Kasus 1: Resource Baru
Bayangkan Anda menambah ProductResource.
Tanpa Shield, Anda harus:
- menentukan permission secara manual
- menyimpan semuanya ke database
- memastikan role tertentu mendapat permission yang benar
Dengan Shield, Anda cukup generate ulang permission, lalu atur pembagiannya melalui panel atau seeder:
php artisan shield:generate --all
Kasus 2: Onboarding Developer Baru
Bayangkan developer baru clone project dan menjalankan:
php artisan migrate:fresh --seed
Kalau seeder Anda rapi, environment itu akan langsung mendapatkan:
- role yang benar
- permission terbaru
- user awal yang tepat
Tanpa perlu setup manual lewat dashboard.
Generate Seeder Shield Secara Otomatis
Jika Anda sudah mengatur Role, Permission, dan akun User melalui dashboard Filament lalu ingin menyimpannya ke dalam file seeder, gunakan:
php artisan shield:seeder --generate --with-users --all -F
Penjelasan Opsi
--generate: membuat permission untuk semua Resource, Page, dan Widget yang terdaftar--with-users: menyertakan data user yang sudah memiliki role atau permission--all: mengekspor semua user dari database-Fatau--force: menimpa fileShieldSeeder.phpyang sudah ada
Langkah-langkah Interaktif
Saat menjalankan command di atas, biasanya Anda akan diminta memilih:
- panel yang digunakan
- jenis data yang ingin di-generate
- cara menangani password user
Jika ingin login kembali dengan password hash yang sudah ada setelah migrate:fresh, pilih opsi yang menyertakan password hasil hash tersebut.
Cara Pikir Saya Soal Authorization
Saya lebih suka authorization yang:
- jelas secara struktur
- tidak tersebar tanpa pola
- bisa di-regenerate
- mudah dipulihkan lewat seeder
- dapat dipelihara tanpa bergantung hanya pada database production
Artinya, role dan permission dianggap sebagai bagian dari infrastruktur aplikasi, bukan data manual sesaat.
Rekomendasi
- Simpan role penting di seeder
- Gunakan naming convention yang konsisten
- Uji hasil seeder dengan
migrate:fresh --seed - Perlakukan authorization setup sebagai bagian dari source of truth project
- Gunakan
Gate::beforeuntuk super_admin agar tidak perlu assign permission satu per satu