Lewati ke konten utama

Alur Hak Akses & Peran

Kontrol akses dibangun dari Spatie Laravel Permission + Filament Shield.


Tiga lapis penjagaan

Aturan masuk panel

User::canAccessPanel() hanya memeriksa satu hal: user punya minimal satu role. User tanpa role sama sekali tidak bisa masuk /admin walaupun akunnya valid.


Lima peran bawaan

Dibuat oleh RolePermissionSeeder.

Matriks izin bawaan

Model / Fitursuper_adminadminpetugasdokter
User✅ semua👁️ + Create + Update
Role (Peran User)✅ semua👁️ baca
Setting (Pengaturan)✅ semua👁️ + Update
Patient✅ semua✅ CRUD penuh👁️ + Create + Update👁️ baca
Doctor✅ semua✅ CRUD penuh👁️ baca👁️ baca
Polyclinic✅ semua✅ CRUD penuh👁️ baca👁️ baca
DoctorSchedule✅ semua✅ CRUD penuh👁️ + Create + Update👁️ baca
Appointment✅ semua✅ CRUD penuh👁️ + Create + Update👁️ + Update
Billing✅ semua✅ CRUD penuh👁️ + Create + Update👁️ baca
Package✅ semua✅ CRUD penuh
TokenPrice✅ semua✅ CRUD penuh
Contact✅ semua👁️ + Update + Delete👁️ + Update👁️ baca
ChatLabel✅ semua✅ CRUD penuh👁️ + Create + Update (tanpa hapus)
WhatsappBusinessAccount✅ semua✅ CRUD penuh
BookingRequest✅ semua👁️ baca saja👁️ baca saja
BookingRequest sengaja baca-saja untuk SEMUA peran

Draft booking dibuat oleh alur pembayaran dan hanya boleh berubah lewat callback Duitku atau sapuan terjadwal. Izin tulisnya tidak pernah dibuat sama sekali — jadi kalau penjagaan hardcoded di resource suatu saat dilepas, tidak ada izin yang menunggu untuk membuka pengeditan.

Kenapa petugas bisa melihat BookingRequest tapi dokter tidak

Petugas adalah satu-satunya peran non-admin dengan Create:Appointment — dialah yang menjadwalkan manual. Ia harus bisa menemukan draft berstatus Failed (uang masuk, janji temu tak terbit). Dokter tidak diberi karena isinya nominal dan status pembayaran, bukan data klinis.

Akun bawaan seeder

EmailPeranPassword
superadmin@gmail.comsuper_adminpassword
admin@gmail.comadminpassword
dokter@gmail.comdokterpassword
petugas@gmail.competugaspassword
pasien@gmail.compasienpassword
Ganti password bawaan di produksi

Akun-akun ini hanya untuk pengembangan. Wajib diganti atau dihapus sebelum go-live.


Penamaan izin

Shield membangun nama izin dengan pola {Aksi}:{Model}:

Untuk halaman (bukan resource), polanya View:{NamaPage} — contoh View:ChatRoomsPage.


Halaman kustom & permission-nya

Semua halaman kustom mewarisi ComingSoonPage, yang menambahkan penjagaan Shield.

Permission key di-cache per kelas halaman supaya tidak mengulang lookup di setiap render.

HalamanPermission
Chat RoomsView:ChatRoomsPage
SIMRS SyncView:SimrsSync
Antrian LoketView:QueueBoardPage
Dashboard AntrianView:QueueDashboardPage
API & SDKView:ApiSdkPage
Menu hilang = izin belum diberikan

shouldRegisterNavigation() memanggil canAccess(). Jadi menu yang tidak muncul selalu berarti izinnya belum diberikan ke peran user tersebut — bukan bug tampilan.


Impersonasi (masuk sebagai user lain)

Fitur dari paket filament-impersonate, diatur di config/panel-access.php.

EnvFungsiDefault
FILAMENT_IMPERSONATOR_ROLESPeran yang boleh impersonatesuper_admin,admin
FILAMENT_IMPERSONATION_BLOCKED_ROLESPeran yang tidak boleh jadi targetsuper_admin

Nilainya dipisah koma. Kalau kosong/tidak valid, sistem jatuh ke default.


Penjagaan tambahan di resource

Beberapa resource punya aturan di luar sistem izin standar:

ResourceAturan
UserPeran admin (yang bukan super_admin) tidak melihat user ber-role super_admin di daftar
BookingRequestBaca-saja, dijaga di level resource sekaligus tidak punya izin tulis
WhatsappBusinessAccountPenghapusan ditutup di level resource — bahkan super_admin tidak bisa. Diganti tombol aktif/nonaktif
ContactTombol hapus dilepas dari panel kontak
Chat RoomsNon-admin hanya melihat percakapan yang di-assign kepadanya di tab Assigned
ChatLabelpetugas boleh membuat dan mengubah label (label bersifat global, dan dialah yang menangani chat sehari-hari), tetapi menghapus label milik tim tetap urusan admin

Middleware CheckRole

Middleware sederhana untuk rute non-Filament:

Route::middleware('role:admin,petugas')->group(...);

Menolak dengan 403 kalau user tidak punya salah satu peran yang disebut. Berbeda dari sistem izin Shield yang berbasis permission.


Mengelola peran di UI

Menu Pengaturan → Peran User (plugin Shield) menampilkan seluruh permission dalam kotak centang, dikelompokkan per resource/halaman/widget.

Setelah menambah resource/halaman baru

Permission untuk resource atau halaman baru tidak otomatis muncul di peran yang sudah ada. Generate ulang permission Shield, lalu centang manual di peran yang membutuhkannya.