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
MenuName | ROLE_ROOT | ROLE_ADMIN | ROLE_USER |
---|---|---|---|
SystemMenu | ✅ | ❌ | ❌ |
UserMenu | ❌ | ✅ | ❌ |
UserSubMenu_allow | ❌ | ✅ | ✅ |
UserSubSubMenu | ❌ | ✅ | ✅ |
UserSubMenu_deny | ❌ | ✅ | ❌ |
AdminMenu | ✅ | ✅ | ❌ |
AdminSubMenu_allow | ✅ | ✅ | ❌ |
AdminSubMenu_deny | ✅ | ❌ | ❌ |
2. Контроль дозволів меню
Список усіх пунктів меню, доступних для даного користувача, можна визначити за допомогою функції findAccessibleMenus()
у MenuService. Щоб перевірити, чи має конкретний користувач права доступу до визначеного пункту меню, можна використовувати метод checkMenuAccess()
. Цей підхід забезпечує ефективний контроль дозволів меню, використовуючи можливості jCasbin для ефективного управління правами доступу.