Programming Tutorial Laravel Authorization 27 July 2025

Panduan Laravel Spatie Permission: Role & Permission Mudah untuk Pemula

Panduan Laravel Spatie Permission: Role & Permission Mudah untuk Pemula
Bagikan:

Pernah nggak sih kamu bingung gimana cara membatasi akses user di aplikasi Laravel? Misal, cuma admin yang boleh edit data, atau user biasa hanya bisa lihat saja. Nah, di dunia Laravel, ada satu package super populer yang bisa bikin urusan role & permission jadi gampang banget: Spatie Laravel Permission.

Artikel ini bakal membimbing kamu dari nol sampai paham cara setup, pakai, dan best practice permission di Laravel. Semua dijelaskan dengan bahasa santai, analogi sehari-hari, dan contoh kode yang bisa langsung dicoba. Yuk, mulai!

Kenapa Perlu Role & Permission?

Bayangin aplikasi seperti sekolah online. Ada admin, guru, dan murid. Tentu hak akses mereka beda-beda, kan? Dengan role & permission, kamu bisa atur siapa boleh apa—tanpa ribet cek manual di setiap controller.

Persiapan: Instalasi & Setup

  1. Install package
composer require spatie/laravel-permission
  1. Publish config & migration
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
  1. Jalankan migration
php artisan migrate
  1. Tambahkan trait di model User
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;
    // ...
}

Membuat Role & Permission

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'admin']);
$permission = Permission::create(['name' => 'edit articles']);

Assign Role & Permission ke User

$user = User::find(1);
$user->assignRole('admin');
$user->givePermissionTo('edit articles');

Cek Role & Permission di Controller/Blade

// Cek di controller
if ($user->hasRole('admin')) {
    // ...
}
if ($user->can('edit articles')) {
    // ...
}

// Di Blade
@can('edit articles')
    <button>Edit</button>
@endcan

Middleware Proteksi Route

// Di routes/web.php
Route::group(['middleware' => ['role:admin']], function () {
    // hanya admin
});
Route::group(['middleware' => ['permission:edit articles']], function () {
    // hanya yang punya permission
});
Route::group(['middleware' => ['role_or_permission:admin|edit articles']], function () {
    // admin atau yang punya permission
});

Seeder Role & Permission (Contoh Praktis)

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\PermissionRegistrar;

class PermissionsDemoSeeder extends Seeder
{
    public function run(): void
    {
        app()[PermissionRegistrar::class]->forgetCachedPermissions();
        Permission::create(['name' => 'edit articles']);
        Permission::create(['name' => 'delete articles']);
        $roleAdmin = Role::create(['name' => 'admin']);
        $roleAdmin->givePermissionTo(['edit articles', 'delete articles']);
        $user = \App\Models\User::factory()->create([
            'name' => 'Admin',
            'email' => 'admin@example.com',
        ]);
        $user->assignRole($roleAdmin);
    }
}

Query User Berdasarkan Role/Permission

// Semua user dengan role tertentu
$users = User::role('admin')->get();
// User dengan permission tertentu
$users = User::permission('edit articles')->get();
// User tanpa role
$users = User::doesntHave('roles')->get();

Best Practice & Tips

  • Gunakan permission, bukan hanya role. Permission lebih fleksibel dan mudah diatur.
  • Cache permission otomatis. Package ini sudah handle cache, tapi kalau develop, bisa clear cache dengan:
php artisan optimize:clear
  • Integrasi dengan Enum (Laravel 9+):
$user->hasPermissionTo(PermissionsEnum::EDITPOSTS);
  • Gunakan middleware untuk proteksi route, bukan di setiap controller.
  • Bisa multi-guard: Atur guard di config/permission.php jika punya lebih dari satu tipe user.
  • Wildcard permission:
Permission::create(['name'=>'posts.*']);
$user->givePermissionTo('posts.create');
  • Testing: Set cache driver ke ‘array’ di phpunit.xml agar test permission tidak bentrok.

Troubleshooting Error Umum

  • Role/permission tidak terdeteksi: Pastikan trait HasRoles sudah di model User.
  • Cache permission tidak update: Jalankan php artisan optimize:clear.
  • Migration error: Pastikan migration sudah dijalankan dan tidak ada duplikasi table.
  • Guard mismatch: Cek guard_name di model dan config.

Penutup: Akses Aman, Coding Nyaman

Dengan Spatie Laravel Permission, kamu bisa atur akses user dengan mudah, aman, dan scalable. Cocok untuk aplikasi kecil sampai enterprise. Jangan ragu eksplorasi fitur lanjutan seperti multi-guard, wildcard, dan enum. Selamat mencoba!


Referensi Lanjutan: