Implementasi Role & Permission

Implementasi Role dan Permission

Di lesson ini, kita akan mengatur siapa yang boleh mengakses apa. Setiap user punya role berbeda dengan hak akses berbeda.

Apa itu Role dan Permission?

Bayangkan rumah sakit Anda:

Dokter Boleh periksa pasien, tulis resep, lihat rekam medis
Perawat Boleh input vital signs, panggil antrian
Apoteker Boleh proses resep, kelola stok obat
Kasir Boleh terima pembayaran, cetak nota
Admin Boleh akses SEMUA fitur

Ini namanya Role-Based Access Control (RBAC)
Yang Akan Dibuat:

1. Install Laravel Breeze (sistem login)
2. Install Spatie Permission (sistem role)
3. Buat 6 role: Admin, Dokter, Perawat, Farmasi, Kasir, Pendaftaran
4. Buat user contoh untuk setiap role
5. Proteksi routes agar hanya user tertentu yang bisa akses

Step 1: Install Laravel Breeze

Lokasi: Terminal / Command Prompt
Aksi: [JALANKAN COMMAND]
Cara: Buka terminal di folder project, jalankan command berikut SATU PER SATU:
Apa itu Laravel Breeze?

Laravel Breeze adalah "starter kit" yang menyediakan halaman:
- Login (masuk ke sistem)
- Register (daftar akun baru)
- Forgot Password (lupa password)
- Email Verification (verifikasi email)

Kita tidak perlu buat halaman login dari nol - Breeze sudah menyediakannya!
# 1. Install package Breeze
composer require laravel/breeze --dev

# 2. Install Breeze dengan template Blade (tunggu sampai selesai)
php artisan breeze:install blade

# 3. Install dependencies frontend
npm install

# 4. Compile assets
npm run build

# 5. Jalankan migration untuk tabel users
php artisan migrate
Penjelasan Setiap Command:

composer require Download package dari internet
breeze:install blade Generate file-file login dengan template Blade
npm install Install dependencies JavaScript (TailwindCSS)
npm run build Compile CSS dan JavaScript
Verifikasi:
Buka browser: http://localhost:8000/login
Harus muncul halaman login dengan form email dan password.

Step 2: Install Spatie Permission

Lokasi: Terminal / Command Prompt
Aksi: [JALANKAN COMMAND]
Cara: Jalankan command berikut SATU PER SATU:
Apa itu Spatie Permission?

Spatie Permission adalah package paling populer untuk mengatur role dan permission di Laravel.

Fitur utamanya:
- Assign role ke user: $user->assignRole('dokter')
- Cek role: $user->hasRole('admin')
- Cek permission: $user->can('edit-pasien')
# 1. Install package Spatie Permission
composer require spatie/laravel-permission

# 2. Publish file konfigurasi dan migration
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

# 3. Jalankan migration untuk tabel roles dan permissions
php artisan migrate
Tabel yang Dibuat:

roles Daftar role (admin, dokter, perawat, dll)
permissions Daftar permission (create-pasien, edit-pasien, dll)
model_has_roles Relasi user dengan role
role_has_permissions Relasi role dengan permission

Step 3: Tambahkan HasRoles ke Model User

Lokasi File: app/Models/User.php
Aksi: [UPDATE FILE]
Cara: Buka file app/Models/User.php, tambahkan use HasRoles; di dalam class:
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Spatie\Permission\Traits\HasRoles;  // TAMBAHKAN INI

class User extends Authenticatable
{
    use HasFactory, Notifiable, HasRoles;  // TAMBAHKAN HasRoles

    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }
}
Yang Ditambahkan:

1. use Spatie\Permission\Traits\HasRoles; di atas class
2. HasRoles di dalam use HasFactory, Notifiable, HasRoles;

Step 4: Buat Seeder untuk Roles dan Users

Lokasi: Terminal / Command Prompt
Aksi: [JALANKAN COMMAND]
Cara: Buat file seeder baru:
# Buat file seeder
php artisan make:seeder RolePermissionSeeder
Lokasi File: database/seeders/RolePermissionSeeder.php
Aksi: [UPDATE FILE]
Cara: Buka file yang baru dibuat, HAPUS SEMUA isinya, lalu PASTE kode di bawah ini:
<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

class RolePermissionSeeder extends Seeder
{
    public function run(): void
    {
        // Reset cache permission
        app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();

        // ===== BUAT ROLES =====
        $roles = [
            'admin'       => 'Administrator - Akses penuh ke semua fitur',
            'dokter'      => 'Dokter - Pemeriksaan dan rekam medis',
            'perawat'     => 'Perawat - Triase dan vital signs',
            'farmasi'     => 'Farmasi - Kelola obat dan resep',
            'kasir'       => 'Kasir - Pembayaran',
            'pendaftaran' => 'Pendaftaran - Daftar pasien dan antrian',
        ];

        foreach ($roles as $name => $description) {
            Role::create(['name' => $name]);
        }
        $this->command->info('6 roles berhasil dibuat!');

        // ===== BUAT USER CONTOH =====
        
        // 1. Admin
        $admin = User::create([
            'name' => 'Administrator',
            'email' => 'admin@simrs.test',
            'password' => Hash::make('password'),
        ]);
        $admin->assignRole('admin');

        // 2. Dokter
        $dokter = User::create([
            'name' => 'dr. Ahmad Wijaya, Sp.PD',
            'email' => 'dokter@simrs.test',
            'password' => Hash::make('password'),
        ]);
        $dokter->assignRole('dokter');

        // 3. Perawat
        $perawat = User::create([
            'name' => 'Ns. Siti Aminah, S.Kep',
            'email' => 'perawat@simrs.test',
            'password' => Hash::make('password'),
        ]);
        $perawat->assignRole('perawat');

        // 4. Farmasi
        $farmasi = User::create([
            'name' => 'apt. Budi Santoso, S.Farm',
            'email' => 'farmasi@simrs.test',
            'password' => Hash::make('password'),
        ]);
        $farmasi->assignRole('farmasi');

        // 5. Kasir
        $kasir = User::create([
            'name' => 'Dewi Lestari',
            'email' => 'kasir@simrs.test',
            'password' => Hash::make('password'),
        ]);
        $kasir->assignRole('kasir');

        // 6. Pendaftaran
        $pendaftaran = User::create([
            'name' => 'Rina Wulandari',
            'email' => 'pendaftaran@simrs.test',
            'password' => Hash::make('password'),
        ]);
        $pendaftaran->assignRole('pendaftaran');

        $this->command->info('6 users contoh berhasil dibuat!');
    }
}
Lokasi: Terminal / Command Prompt
Aksi: [JALANKAN COMMAND]
Cara: Jalankan seeder untuk membuat roles dan users:
# Jalankan seeder
php artisan db:seed --class=RolePermissionSeeder
Output yang Diharapkan:
6 roles berhasil dibuat!
6 users contoh berhasil dibuat!

Step 5: Register Middleware Role (Laravel 11)

Lokasi File: bootstrap/app.php
Aksi: [UPDATE FILE]
Cara: Buka file bootstrap/app.php, tambahkan alias middleware:
<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        // Register middleware Spatie Permission
        $middleware->alias([
            'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
            'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();
Penjelasan:

Di Laravel 11, middleware didaftarkan di bootstrap/app.php, bukan di Kernel.php seperti Laravel 10.

Setelah ini, kita bisa gunakan middleware role:admin di routes.

Full Source Code

Files yang Dibuat/Dimodifikasi (3 files):

1 app/Models/User.php [UPDATE FILE] Step 3
2 database/seeders/RolePermissionSeeder.php [BUAT FILE BARU] Step 4
3 bootstrap/app.php [UPDATE FILE] Step 5

Checkpoint - Test Manual

Langkah Testing:

1. Test Login sebagai Admin:
- Buka browser: http://localhost:8000/login
- Email: admin@simrs.test
- Password: password
- Klik Login → Harus redirect ke Dashboard

2. Test Login sebagai Dokter:
- Logout dulu (klik tombol Logout)
- Login dengan: dokter@simrs.test / password
- Harus bisa masuk ke Dashboard

3. Cek Role di Database:
- Buka phpMyAdmin: http://localhost/phpmyadmin
- Pilih database simrs_db
- Klik tabel roles → Harus ada 6 role
- Klik tabel users → Harus ada 6 user
- Klik tabel model_has_roles → Harus ada 6 relasi user-role
Troubleshooting Error Umum:

Error: "Role admin does not exist"
Solusi: Jalankan php artisan db:seed --class=RolePermissionSeeder

Error: "npm: command not found"
Solusi: Install Node.js dari nodejs.org

Error: "SQLSTATE[23000]: Duplicate entry"
Solusi: Role/user sudah ada. Jalankan php artisan migrate:fresh --seed untuk reset database.

Data Login User Contoh

Gunakan kredensial berikut untuk testing:

Role Email Password
Admin admin@simrs.test password
Dokter dokter@simrs.test password
Perawat perawat@simrs.test password
Farmasi farmasi@simrs.test password
Kasir kasir@simrs.test password
Pendaftaran pendaftaran@simrs.test password

Ringkasan

Yang Sudah Dibuat:

1. Authentication (Laravel Breeze):
- Halaman Login, Register, Forgot Password
- Middleware 'auth' untuk proteksi routes

2. Role Management (Spatie Permission):
- 6 roles: admin, dokter, perawat, farmasi, kasir, pendaftaran
- Model User dengan trait HasRoles
- Middleware 'role' untuk cek akses

3. User Contoh:
- 6 user dengan role masing-masing
- Password sama semua: password
Lesson Berikutnya:
Di Lesson 6: Database Seeder, kita akan membuat data contoh untuk:
- Poliklinik, Dokter, Obat
- Pasien contoh
- Transaksi contoh

Data ini berguna untuk testing tanpa perlu input manual satu per satu.