Menu Permissions
Kami memulai dengan memperkenalkan contoh Spring Boot yang menampilkan sistem menu. Contoh ini menggunakan jCasbin untuk mengelola izin menu. Pada akhirnya, contoh ini bertujuan untuk mengabstraksi middleware, khususnya untuk izin menu, yang dapat diperluas ke bahasa lain yang didukung oleh Casbin, seperti Go dan Python.
1. Berkas Konfigurasi
Anda perlu mengatur manajemen peran dan izin dalam berkas policy.csv, bersama dengan hubungan induk-anak antara item menu. Untuk detail lebih lanjut, silakan merujuk ke repo GitHub ini.
1.1 Gambaran Umum
Dengan menggunakan policy.csv, Anda dapat mengkonfigurasi fleksibel izin peran dan struktur menu untuk kontrol akses yang halus. Berkas konfigurasi ini mendefinisikan izin akses untuk peran yang berbeda pada berbagai item menu, asosiasi antara pengguna dan peran, serta hubungan hierarki antara item menu.
1.2 Definisi Izin (Policies)
- Aturan Kebijakan: Kebijakan didefinisikan dengan awalan 
p, menentukan peran (sub) dan izin mereka (act) pada item menu (obj), bersama dengan efek aturan (eft), di manaallowmenunjukkan izin diberikan, dandenymenunjukkan izin ditolak. 
Contoh:
p, ROLE_ROOT, SystemMenu, read, allowberarti peranROLE_ROOTmemiliki akses baca ke item menuSystemMenu.p, ROLE_ROOT, UserMenu, read, denyberarti peranROLE_ROOTditolak akses baca ke item menuUserMenu.
1.3 Peran dan Asosiasi Pengguna
- Warisan Peran: Hubungan pengguna-peran dan hierarki peran didefinisikan dengan awalan 
g. Hal ini memungkinkan pengguna untuk mewarisi izin dari satu atau beberapa peran. 
Contoh:
g, user, ROLE_USERberarti penggunauserditugaskan peranROLE_USER.g, ROLE_ADMIN, ROLE_USERberartiROLE_ADMINmewarisi izin dariROLE_USER.
1.4 Hierarki Item Menu
- Hubungan Menu: Hubungan induk-anak antara item menu didefinisikan dengan awalan 
g2, membantu dalam pembangunan struktur menu. 
Contoh:
g2, UserSubMenu_allow, UserMenumenunjukkan bahwaUserSubMenu_allowadalah submenu dariUserMenu.g2, (NULL), SystemMenumenunjukkan bahwaSystemMenutidak memiliki item submenu, yang berarti itu adalah item menu tingkat atas.
1.5 Warisan Izin Menu dan Aturan Default
Ketika mengelola izin menu dengan jCasbin, hubungan izin antara menu induk dan menu anak mengikuti aturan warisan tertentu, dengan dua aturan default penting:
Warisan Izin Menu Induk:
Jika sebuah menu induk secara eksplisit diberikan izin allow, semua submenu-nya juga secara default akan memiliki izin allow kecuali jika secara khusus ditandai sebagai deny. Ini berarti setelah sebuah menu induk dapat diakses, submenu-nya juga dapat diakses secara default.
Penanganan Menu Induk Tanpa Pengaturan Izin Langsung:
Jika sebuah menu induk tidak memiliki pengaturan izin langsung (baik secara eksplisit diizinkan maupun ditolak) tetapi memiliki setidaknya satu submenu yang secara eksplisit diberikan izin allow, maka menu induk tersebut secara implisit dianggap memiliki izin allow. Ini memastikan pengguna dapat menavigasi ke submenu ini.
1.6 Aturan Warisan Izin Khusus
Mengenai warisan izin antar peran, terutama dalam skenario yang melibatkan izin deny, aturan berikut harus diikuti untuk memastikan keamanan sistem dan kontrol izin yang tepat:
Perbedaan Antara Penolakan Eksplisit dan Default:
Jika sebuah peran, seperti ROLE_ADMIN, secara eksplisit ditolak akses ke suatu item menu, seperti AdminSubMenu_deny (ditandai sebagai deny), maka bahkan jika peran ini diwariskan oleh peran lain (misalnya, ROLE_ROOT), peran yang mewarisi tidak diperbolehkan mengakses item menu yang ditolak tersebut. Ini memastikan kebijakan keamanan eksplisit tidak dilewati karena warisan peran.
Warisan Izin Penolakan Default:
Sebaliknya, jika penolakan akses sebuah peran ke item menu (misalnya, UserSubMenu_deny) adalah default (tidak secara eksplisit ditandai sebagai deny, tetapi karena tidak secara eksplisit diberikan allow), maka ketika peran ini diwariskan oleh peran lain (misalnya, ROLE_ADMIN), peran yang mewarisi dapat mengganti status deny default, memungkinkan akses ke item menu ini.
1.7 Deskripsi Contoh
kebijakan:
p, ROLE_ROOT, SystemMenu, read, allow
p, ROLE_ROOT, AdminMenu, read, allow
p, ROLE_ROOT, UserMenu, read, deny
p, ROLE_ADMIN, UserMenu, read, allow
p, ROLE_ADMIN, AdminMenu, read, allow
p, ROLE_ADMIN, AdminSubMenu_deny, read, deny
p, ROLE_USER, UserSubMenu_allow, read, allow
g, user, ROLE_USER
g, admin, ROLE_ADMIN
g, root, ROLE_ROOT
g, ROLE_ADMIN, ROLE_USER
g2, UserSubMenu_allow, UserMenu
g2, UserSubMenu_deny, UserMenu
g2, UserSubSubMenu, UserSubMenu_allow
g2, AdminSubMenu_allow, AdminMenu
g2, AdminSubMenu_deny, AdminMenu
g2, (NULL), SystemMenu
| NamaMenu | PERAN_ROOT | PERAN_ADMIN | PERAN_PENGGUNA | 
|---|---|---|---|
| SystemMenu | ✅ | ❌ | ❌ | 
| UserMenu | ❌ | ✅ | ❌ | 
| UserSubMenu_allow | ❌ | ✅ | ✅ | 
| UserSubSubMenu | ❌ | ✅ | ✅ | 
| UserSubMenu_deny | ❌ | ✅ | ❌ | 
| AdminMenu | ✅ | ✅ | ❌ | 
| AdminSubMenu_allow | ✅ | ✅ | ❌ | 
| AdminSubMenu_deny | ✅ | ❌ | ❌ | 
2. Kontrol Izin Menu
Daftar semua item menu yang dapat diakses oleh suatu nama pengguna tertentu dapat diidentifikasi melalui fungsi findAccessibleMenus() yang tersedia di MenuService. Untuk memeriksa apakah pengguna tertentu memiliki hak untuk mengakses item menu yang ditentukan, metode checkMenuAccess() dapat digunakan. Pendekatan ini memastikan bahwa izin menu dikendalikan secara efektif, memanfaatkan kemampuan jCasbin untuk mengelola hak akses secara efisien.