Перейти до основного контенту

Menu Permissions

Ми починаємо з представлення прикладу на Spring Boot, який включає систему меню. Цей приклад використовує jCasbin для управління дозволами меню. Остаточно, він прагне абстрагувати проміжне програмне забезпечення, спеціально для дозволів меню, яке може бути розширене на інші мови, підтримувані Casbin, такі як Go та Python.

1. Файли конфігурації

Вам потрібно налаштувати управління ролями та дозволами у файлі policy.csv, разом з батьківсько-дочірніми відносинами між пунктами меню. Для отримання додаткової інформації, будь ласка, зверніться до цього GitHub репозиторію.

1.1 Огляд

Використовуючи policy.csv, ви можете гнучко налаштувати дозволи ролей та структури меню для детального контролю доступу. Цей конфігураційний файл визначає дозволи доступу для різних ролей до різних пунктів меню, асоціації між користувачами та ролями, та ієрархічні відносини між пунктами меню.

1.2 Визначення дозволів (Політики)

  • Правила політики: Політики визначаються з префіксом p, який вказує ролі (sub) та їхні дозволи (act) на пункти меню (obj), разом з ефектом правила (eft), де allow вказує, що дозвіл надано, а deny вказує, що він відхилений.

Приклади:

  • p, ROLE_ROOT, SystemMenu, read, allow означає, що роль ROLE_ROOT має доступ на читання до пункту меню SystemMenu.
  • p, ROLE_ROOT, UserMenu, read, deny означає, що ролі ROLE_ROOT відмовлено у доступі на читання до пункту меню UserMenu.

1.3 Ролі та асоціації користувачів

  • Спадкування ролей: Відносини користувач-роль та ієрархії ролей визначаються з префіксом g. Це дозволяє користувачам успадковувати дозволи від однієї або декількох ролей.

Приклади:

  • g, user, ROLE_USER означає, що користувач user призначений роллю ROLE_USER.
  • g, ROLE_ADMIN, ROLE_USER означає, що ROLE_ADMIN успадковує дозволи від ROLE_USER.

1.4 Ієрархія пунктів меню

  • Відносини меню: Батьківсько-дочірні відносини між пунктами меню визначаються з префіксом g2, що допомагає у створенні структури меню.

Приклади:

  • g2, UserSubMenu_allow, UserMenu вказує, що UserSubMenu_allow є підменю UserMenu.
  • g2, (NULL), SystemMenu вказує, що SystemMenu не має підменю, тобто це пункт меню верхнього рівня.

1.5 Спадкування дозволів меню та стандартні правила

При управлінні дозволами меню з jCasbin, відносини дозволів між батьківськими та дочірніми меню слідують певним правилам спадкування, з двома важливими стандартними правилами:

Спадкування дозволів батьківського меню:

Якщо батьківському меню явно надано дозвіл allow, то всі його підменю також за замовчуванням мають дозвіл allow, якщо не позначено як deny. Це означає, що як тільки батьківське меню доступне, його підменю також доступні за замовчуванням.

Обробка батьківських меню без прямих налаштувань дозволів:

Якщо батьківське меню не має прямих налаштувань дозволів (ні явно дозволених, ні відхилених), але має принаймні одне підменю, якому явно надано дозвіл allow, то батьківське меню неявно вважається таким, що має дозвіл allow. Це забезпечує можливість користувачів навігувати до цих підменю.

1.6 Особливі правила спадкування дозволів

Що стосується спадкування дозволів між ролями, особливо у сценаріях, що включають дозволи deny, слід дотримуватися наступних правил, щоб забезпечити безпеку системи та точний контроль дозволів:

Розрізнення між явними та за замовчуванням відхиленнями:

Якщо ролі, такій як ROLE_ADMIN, явно відмовлено у доступі до пункту меню, такого як AdminSubMenu_deny (позначено як deny), то навіть якщо ця роль успадкована іншою роллю (наприклад, ROLE_ROOT), успадкована роль не має права доступу до відхиленого пункту меню. Це забезпечує, що явні політики безпеки не обходяться через спадкування ролей.

Спадкування дозволів за замовчуванням відхилення:

Навпаки, якщо відмова ролі у доступі до пункту меню (наприклад, UserSubMenu_deny) є за замовчуванням (не явно позначена як deny, але тому що не була явно надана allow), то коли ця роль успадкована іншою роллю (наприклад, ROLE_ADMIN), успадкована роль може змінити статус за замовчуванням deny, дозволяючи доступ до цих пунктів меню.

1.7 Опис прикладу

policy:

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
MenuNameROLE_ROOTROLE_ADMINROLE_USER
SystemMenu
UserMenu
UserSubMenu_allow
UserSubSubMenu
UserSubMenu_deny
AdminMenu
AdminSubMenu_allow
AdminSubMenu_deny

2. Контроль дозволів меню

Список усіх пунктів меню, доступних для даного користувача, можна визначити за допомогою функції findAccessibleMenus() у MenuService. Щоб перевірити, чи має конкретний користувач права доступу до визначеного пункту меню, можна використовувати метод checkMenuAccess(). Цей підхід забезпечує ефективний контроль дозволів меню, використовуючи можливості jCasbin для ефективного управління правами доступу.