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 manaallow
menunjukkan izin diberikan, dandeny
menunjukkan izin ditolak.
Contoh:
p, ROLE_ROOT, SystemMenu, read, allow
berarti peranROLE_ROOT
memiliki akses baca ke item menuSystemMenu
.p, ROLE_ROOT, UserMenu, read, deny
berarti peranROLE_ROOT
ditolak 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_USER
berarti penggunauser
ditugaskan peranROLE_USER
.g, ROLE_ADMIN, ROLE_USER
berartiROLE_ADMIN
mewarisi 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, UserMenu
menunjukkan bahwaUserSubMenu_allow
adalah submenu dariUserMenu
.g2, (NULL), SystemMenu
menunjukkan bahwaSystemMenu
tidak 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.