Lewati ke konten utama

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

Contoh:

  • p, ROLE_ROOT, SystemMenu, read, allow berarti peran ROLE_ROOT memiliki akses baca ke item menu SystemMenu.
  • p, ROLE_ROOT, UserMenu, read, deny berarti peran ROLE_ROOT ditolak akses baca ke item menu UserMenu.

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 pengguna user ditugaskan peran ROLE_USER.
  • g, ROLE_ADMIN, ROLE_USER berarti ROLE_ADMIN mewarisi izin dari ROLE_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 bahwa UserSubMenu_allow adalah submenu dari UserMenu.
  • g2, (NULL), SystemMenu menunjukkan bahwa SystemMenu 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
NamaMenuPERAN_ROOTPERAN_ADMINPERAN_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.