Menu Permissions
Kami bermula dengan memperkenalkan contoh Spring Boot yang menampilkan sistem menu. Contoh ini menggunakan jCasbin untuk menguruskan kebenaran menu. Pada akhirnya, ia bertujuan untuk mengabstrak middleware, khusus untuk kebenaran menu, yang boleh diperluas kepada bahasa lain yang disokong oleh Casbin, seperti Go dan Python.
1. Fail Konfigurasi
Anda perlu menetapkan pengurusan peranan dan kebenaran dalam fail policy.csv
, bersama dengan hubungan ibu bapa-anak antara item menu. Untuk maklumat lanjut, sila rujuk repo GitHub ini.
1.1 Gambaran Keseluruhan
Menggunakan policy.csv
, anda boleh mengkonfigurasi kebenaran peranan dan struktur menu secara fleksibel untuk kawalan akses yang halus. Fail konfigurasi ini mentakrifkan kebenaran akses untuk peranan yang berbeza pada item menu yang berlainan, perkaitan antara pengguna dan peranan, serta hubungan hierarki antara item menu.
1.2 Takrifan Kebenaran (Polisi)
- Peraturan Polisi: Polisi ditakrifkan dengan awalan
p
, menentukan peranan (sub
) dan kebenaran mereka (act
) pada item menu (obj
), bersama dengan kesan peraturan (eft
), di manaallow
menunjukkan kebenaran diberikan, dandeny
menunjukkan ia ditolak.
Contoh:
p, ROLE_ROOT, SystemMenu, read, allow
bermaksud perananROLE_ROOT
mempunyai akses baca kepada item menuSystemMenu
.p, ROLE_ROOT, UserMenu, read, deny
bermaksud perananROLE_ROOT
ditolak akses baca kepada item menuUserMenu
.
1.3 Peranan dan Persatuan Pengguna
- Warisan Peranan: Hubungan pengguna-peranan dan hierarki peranan ditakrifkan dengan awalan
g
. Ini membolehkan pengguna mewarisi kebenaran dari satu atau berbilang peranan.
Contoh:
g, user, ROLE_USER
bermaksud penggunauser
diberikan perananROLE_USER
.g, ROLE_ADMIN, ROLE_USER
bermaksudROLE_ADMIN
mewarisi kebenaran dariROLE_USER
.
1.4 Hierarki Item Menu
- Hubungan Menu: Hubungan ibu bapa-anak antara item menu ditakrifkan dengan awalan
g2
, membantu dalam pembinaan struktur menu.
Contoh:
g2, UserSubMenu_allow, UserMenu
menunjukkan bahawaUserSubMenu_allow
adalah submenu dariUserMenu
.g2, (NULL), SystemMenu
menunjukkan bahawaSystemMenu
tidak mempunyai item submenu, bermakna ia adalah item menu tingkat atas.
1.5 Warisan Izin Menu dan Peraturan Lalai
Apabila menguruskan kebenaran menu dengan jCasbin, hubungan kebenaran antara menu induk dan menu anak mengikuti peraturan warisan tertentu, dengan dua peraturan lalai penting:
Warisan Kebenaran Menu Induk:
Jika menu induk diberi kebenaran allow
secara jelas, semua submenu-nya juga akan lalai kepada kebenaran allow
melainkan ditandakan secara khusus sebagai deny
. Ini bermakna sebaik sahaja menu induk boleh diakses, submenu-nya juga boleh diakses secara lalai.
Penanganan Menu Induk Tanpa Tetapan Kebenaran Terus:
Jika menu induk tidak mempunyai tetapan kebenaran terus (sama ada dibenarkan atau ditolak secara jelas) tetapi mempunyai sekurang-kurangnya satu submenu yang diberi kebenaran allow
secara jelas, maka menu induk itu dianggap secara tersirat mempunyai kebenaran allow
. Ini memastikan pengguna boleh navigasi ke submenu ini.
1.6 Peraturan Warisan Kebenaran Khas
Mengenai warisan kebenaran antara peranan, terutamanya dalam senario yang melibatkan kebenaran tolak
, peraturan berikut mesti dipatuhi untuk memastikan keselamatan sistem dan kawalan kebenaran yang tepat:
Perbezaan Antara Penafian Jelas dan Penafian Lalai:
Jika satu peranan, seperti ROLE_ADMIN
, dinafikan akses kepada item menu, seperti AdminSubMenu_deny
(ditandakan sebagai deny
), maka walaupun peranan ini diwarisi oleh peranan lain (contohnya, ROLE_ROOT
), peranan yang mewarisi tidak dibenarkan akses kepada item menu yang ditolak. Ini memastikan dasar keselamatan jelas tidak dilangkau kerana warisan peranan.
Warisan Kebenaran Penafian Lalai:
Sebaliknya, jika penafian akses peranan kepada item menu (contohnya, UserSubMenu_deny
) adalah lalai (tidak dinyatakan secara jelas sebagai deny
, tetapi kerana ia tidak diberikan secara jelas allow
), maka apabila peranan ini diwarisi oleh peranan lain (contohnya, ROLE_ADMIN
), peranan yang mewarisi boleh mengatasi status deny
lalai, membenarkan akses kepada item menu ini.
1.7 Penerangan Contoh
dasar:
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. Kawalan Kebenaran Menu
Senarai semua item menu yang boleh diakses oleh nama pengguna tertentu boleh dikenal pasti melalui fungsi findAccessibleMenus()
yang tersedia dalam MenuService. Untuk memeriksa sama ada pengguna tertentu mempunyai hak untuk mengakses item menu yang ditetapkan, kaedah checkMenuAccess()
boleh digunakan. Pendekatan ini memastikan bahawa kebenaran menu dikawal dengan berkesan, menggunakan keupayaan jCasbin untuk menguruskan hak akses secara cekap.