# Peran dan Akses (RBAC)

## Peran awal (asumsi)
Superadmin teknis, admin akademik, PMB, prodi, dosen, dosen wali, mahasiswa, keuangan, kemahasiswaan, operator tugas akhir/yudisium/wisuda, auditor/pimpinan. Peran final harus disetujui kampus.

Peran mahasiswa ditautkan ke satu rekam mahasiswa. Portal memperbolehkan akses KRS dan hasil studi milik sendiri; pemeriksaan kepemilikan tetap dilakukan server meski ID rekam lain dimasukkan langsung ke URL.

## Aturan
- Beri akses minimum berdasarkan aksi dan cakupan data (unit/prodi/periode/mahasiswa).
- Pisahkan melihat, membuat, mengubah, menyetujui, mengesahkan, mengekspor, dan mengelola pengguna.
- Mahasiswa hanya melihat data diri; dosen hanya kelas/mahasiswa yang ditugaskan; operator terbatas pada unitnya.
- Gunakan policy server-side untuk setiap resource; menyembunyikan tombol bukan kontrol keamanan.
- Tindakan sensitif memakai autentikasi ulang atau persetujuan kedua bila kebijakan meminta.
- Hindari akun bersama; pencabutan akses berlaku segera dan perubahan peran diaudit.

## Matriks awal
| Aksi | Mahasiswa | Dosen | Admin akademik | Auditor |
|---|---:|---:|---:|---:|
| Lihat KHS sendiri | Ya | Tidak | Ya, sesuai tugas | Baca sesuai mandat |
| Isi presensi/nilai kelas tugas | Tidak | Ya | Terbatas | Baca |
| Finalisasi nilai | Tidak | Ajukan | Setujui sesuai delegasi | Baca |
| Ubah master akademik | Tidak | Tidak | Ya | Tidak |
| Ekspor data pribadi | Sendiri terbatas | Kelas tugas | Sesuai kewenangan | Hanya mandat |

## Pengelolaan peran
Pemilik permission roles.manage dapat membuat peran dan memperbarui matriks permission. Hak penuh superadmin dikunci; permission untuk mengelola peran tidak dapat diberikan melalui editor. Perubahan matriks disimpan ke audit log dengan ID permission lama dan baru.

## Penerimaan
Setiap endpoint diuji dengan akun lintas peran dan lintas cakupan; akses langsung yang tidak sah ditolak dan tercatat. Detail keamanan di [keamanan dan privasi](10-keamanan-privasi.md).

## Fondasi implementasi saat ini
- Tabel `roles`, `permissions`, dan relasi pengguna/peran serta peran/permission dibuat melalui migrasi. Seeder menyiapkan peran awal dan permission untuk dashboard, profil institusi, periode akademik, serta pengelolaan akses.
- Middleware `permission` melindungi endpoint di server. `super-admin` melewati pemeriksaan permission; `admin-akademik` mendapat akses pengaturan institusi/periode; `auditor` hanya mendapat akses baca pada fondasi saat ini.
- Tidak ada pendaftaran publik. Akun superadmin pertama dibuat dari perintah terminal `php artisan siakad:make-admin`; kata sandi diminta secara tersembunyi.
- UI untuk membuat/mengubah akun staf tersedia bagi pemilik `users.manage`; pengguna dapat diberi satu peran dan dinonaktifkan tanpa dihapus. Peran dapat dibuat dan matriks hak aksesnya diubah oleh pemilik `roles.manage`; superadmin dan izin `roles.manage` dilindungi dari perubahan melalui editor.
- Superadmin dapat memberi peran superadmin; sistem mencegah penonaktifan/demosi akun superadmin terakhir dan mencegah pengguna menonaktifkan atau menurunkan perannya sendiri.
- Permission `organizational-unit.*` dan `study-program.*` melindungi pengelolaan master unit/prodi; peran `admin-akademik` mendapat akses kelola dan `auditor` mendapat akses baca.
- Permission `course.*` dan `academic-calendar.*` melindungi katalog mata kuliah serta agenda kalender; pembatalan agenda memakai izin tersendiri dan menyimpan agenda dalam status batal.
- Permission `curriculum.*` membatasi pembuatan, penyusunan, penerbitan, dan pengarsipan versi kurikulum. Auditor memiliki akses baca; susunan terbit dikunci.
- Permission `course-offering.*` membatasi pembuatan dan perubahan status rencana kelas. Kelas hanya dapat dibuat dari mata kuliah pada kurikulum terbit; auditor memiliki akses baca.
- Permission `room.*` membatasi data ruang; `class-meeting.manage` membatasi penambahan dan penghapusan jadwal pertemuan. Admin akademik mengelola keduanya; auditor dapat melihat ruang.
- Permission `lecturer.*` membatasi data dosen; penetapan dosen pada jadwal mengikuti izin `class-meeting.manage`. Auditor hanya dapat melihat data dosen.
- Permission `student.*` membatasi data mahasiswa; `study-plan.view/manage/review` memisahkan akses baca, penyusunan/pengajuan, dan keputusan KRS. Admin akademik mengelola ketiganya; auditor hanya membaca sesuai mandat.
- Endpoint keputusan KRS secara eksplisit menolak akun ber-role mahasiswa, sekalipun permission `study-plan.review` keliru diberikan. Mahasiswa hanya dapat menyusun dan mengajukan KRS miliknya sendiri.
- `student.status.manage` memisahkan perubahan status akademik dari perubahan identitas; hanya superadmin dan admin akademik awal yang mendapatkannya. Scope prodi dan approval kedua belum tersedia.
- `student.export` membatasi unduhan daftar mahasiswa pada superadmin dan admin akademik awal; ekspor mengikuti filter pencarian daftar, membatasi kolom, dan membuat jejak audit tanpa nilai pencarian.
- `final-project.view/create/update` memisahkan baca, pencatatan, dan perubahan register tugas akhir; `final-project.consultation.manage` membatasi catatan bimbingan. Superadmin dan admin akademik awal mendapat izin; dosen belum mendapat portal atau akses terbatas per penugasan.
- `yudisium.view/create/review` memisahkan antrean, pengajuan, dan keputusan. Hanya role admin akademik/superadmin awal yang mendapat akses; role unit/prodi dan delegasi peninjau belum tersedia.
- `graduation.view/manage/registration.manage` memisahkan baca, kelola acara, dan daftar peserta. Role `wisuda` disediakan dengan akses acara; hanya lulusan dengan yudisium approved dan status akademik graduated yang dapat didaftarkan.
- Permission `attendance.view` memberi akses baca daftar kelas, pertemuan, dan presensi; `attendance.manage` mengizinkan pencatatan dan perubahan presensi. Admin akademik mendapat keduanya, auditor hanya akses baca, dan dosen mendapat keduanya dengan pemeriksaan penugasan pada setiap endpoint.
- Permission `grade.view` memberi akses baca komponen dan nilai; `grade.manage` mengizinkan perubahan komponen/skor dan pengajuan; `grade.review` memisahkan persetujuan atau pengembalian. Admin akademik mendapat ketiganya, auditor hanya baca, dan dosen memiliki `grade.view/manage` hanya pada kelas tugas. Role dosen ditolak dari endpoint review sekalipun hak itu keliru diberikan.
- Permission `academic-result.view` membatasi akses ringkasan hasil studi mahasiswa. Admin akademik dan auditor awal dapat membaca; role mahasiswa dapat melihat data miliknya sendiri melalui pemeriksaan ownership server-side.
- `student-activity.view/manage` membatasi akses baca dan pencatatan kegiatan/prestasi; role `kemahasiswaan` mengelola catatan umum dan auditor hanya membaca. Catatan konseling/aduan yang sensitif tidak termasuk modul.
- `integration.view` memberi akses ke layar pemetaan dan riwayat batch; `integration.mapping.manage` mengizinkan operator mengelola ID mapping. Peran `operator-pddikti` disediakan dengan akses baca data referensi yang diperlukan dan kelola mapping. Integrasi belum mengirim atau mengambil data.
- `lecturer-portal.view` memberi role `dosen` akses ke jadwal/roster portal. Server memastikan akun terhubung ke rekam dosen aktif dan hanya memuat kelas dengan dosen tersebut pada jadwalnya; form presensi/nilai berada pada modul akademik dan tetap dibatasi assignment. Ketiadaan rekam dosen aktif mengembalikan 403 Forbidden.
- `student-portal.view` memberi role `mahasiswa` akses ke portal mahasiswa (profil akademik, KRS, dan hasil studi). Server memastikan akun terhubung ke data mahasiswa aktif; ketiadaan rekam mahasiswa aktif mengembalikan 403 Forbidden yang konsisten (bukan 404), sehingga pengelola superadmin dapat memahami mengapa portal memerlukan penautan civitas.
- Permission `grading-scale.manage` membatasi penambahan, perubahan, dan penghapusan skala nilai. Admin akademik mengelola; auditor tidak dapat mengubah konfigurasi.
- `academic-rules.manage` melindungi batas SKS dan kaidah IPK yang telah disahkan; nilai kosong tidak memaksakan aturan.
- `finance.view`, `finance.bill.manage`, `finance.payment.manage`, dan `finance.payment.void` memisahkan baca, tagihan, pencatatan pembayaran, dan pembatalan dengan alasan. Role `keuangan` disediakan; pembatalan meninggalkan riwayat.
- Permission `admission.view/manage/review/convert` memisahkan lihat data PMB, kelola siklus, tinjau keputusan, dan konversi pendaftar menjadi mahasiswa. Peran PMB awal memperoleh akses sesuai tugas; endpoint formulir publik hanya menerima pendaftaran pada siklus yang sedang dibuka.
- Permission `audit.view` membatasi pembacaan riwayat perubahan; admin dan auditor awal dapat membaca, tanpa hak mengubah atau menghapus log melalui UI. Middleware mencatat route terlindungi yang berhasil dibaca oleh pengguna yang berwenang. Log baca hanya berisi aktor, waktu, dan nama route, bukan ID data atau parameter URL.
- Login/logout, perubahan akun/peran melalui pengelolaan pengguna, ekspor mahasiswa, dan unduhan dokumen PMB dicatat. Audit akses baca umum dan perubahan permission langsung di luar UI belum tersedia; scope per prodi juga belum tersedia.
- final-project.exam.manage membatasi pencatatan jadwal/hasil ujian tugas akhir; jenis/status bebas mengikuti istilah kampus dan tidak mengubah status yudisium otomatis.
