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:
Ini namanya Role-Based Access Control (RBAC)
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
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:
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!
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:
Harus muncul halaman login dengan form email dan password.
Buka browser:
http://localhost:8000/loginHarus 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:
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:
- Cek role:
- Cek 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:
Aksi: [UPDATE FILE]
Cara: Buka file
app/Models/User.phpAksi: [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.
2.
1.
use Spatie\Permission\Traits\HasRoles; di atas class2.
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:
Aksi: [JALANKAN COMMAND]
Cara: Buat file seeder baru:
# Buat file seeder
php artisan make:seeder RolePermissionSeeder
Lokasi File:
Aksi: [UPDATE FILE]
Cara: Buka file yang baru dibuat, HAPUS SEMUA isinya, lalu PASTE kode di bawah ini:
database/seeders/RolePermissionSeeder.phpAksi: [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:
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:
Aksi: [UPDATE FILE]
Cara: Buka file
bootstrap/app.phpAksi: [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
Setelah ini, kita bisa gunakan middleware
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:
- Email:
- Password:
- Klik Login → Harus redirect ke Dashboard
2. Test Login sebagai Dokter:
- Logout dulu (klik tombol Logout)
- Login dengan:
- Harus bisa masuk ke Dashboard
3. Cek Role di Database:
- Buka phpMyAdmin:
- Pilih database
- Klik tabel
- Klik tabel
- Klik tabel
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
Error: "npm: command not found"
Solusi: Install Node.js dari nodejs.org
Error: "SQLSTATE[23000]: Duplicate entry"
Solusi: Role/user sudah ada. Jalankan
Error: "Role admin does not exist"
Solusi: Jalankan
php artisan db:seed --class=RolePermissionSeederError: "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 | 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:
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.
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.