Langkau ke kandungan utama

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 mana allow menunjukkan kebenaran diberikan, dan deny menunjukkan ia ditolak.

Contoh:

  • p, ROLE_ROOT, SystemMenu, read, allow bermaksud peranan ROLE_ROOT mempunyai akses baca kepada item menu SystemMenu.
  • p, ROLE_ROOT, UserMenu, read, deny bermaksud peranan ROLE_ROOT ditolak akses baca kepada item menu UserMenu.

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 pengguna user diberikan peranan ROLE_USER.
  • g, ROLE_ADMIN, ROLE_USER bermaksud ROLE_ADMIN mewarisi kebenaran dari ROLE_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 bahawa UserSubMenu_allow adalah submenu dari UserMenu.
  • g2, (NULL), SystemMenu menunjukkan bahawa SystemMenu 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
NamaMenuPERAN_ROOTPERAN_ADMINPERAN_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.