**Menu Permissions**
На этой странице показан пример Spring Boot, использующий jCasbin для управления доступом на основе меню. Этот же шаблон (политики + назначения ролей + иерархия меню) можно применить на других языках, поддерживаемых Casbin.
1. Конфигурация
Определите разрешения «роль–меню», назначения «пользователь–роль» и иерархию меню в policy.csv. Полный пример: jCasbin menu permission.
1.1 Обзор
Файл политик определяет: (1) какие роли имеют доступ к каким пунктам меню, (2) какие пользователи имеют какие роли и (3) родительско-дочерние связи между пунктами меню. Вместе это обеспечивает ролевую, иерархическую видимость меню.
1.2 Правила разрешений (p)
Строки, начинающиеся с 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, назначают пользователей ролям и определяют наследование ролей. Пользователи получают объединение разрешений всех своих ролей.
Примеры:
g, user, ROLE_USERназначает пользователя с именемuserролиROLE_USER.g, ROLE_ADMIN, ROLE_USERзаставляетROLE_ADMINнаследовать все разрешения отROLE_USER.
1.4 Иерархия меню (g2)
Строки, начинающиеся с g2, определяют структуру родительских и дочерних меню.
Примеры:
g2, UserSubMenu_allow, UserMenuделаетUserSubMenu_allowдочерним элементомUserMenu.g2, (NULL), SystemMenuпомечаетSystemMenuкак меню верхнего уровня без родителя.
1.5 Наследование разрешений для меню
- Если у родительского меню явно указано
allow, его дочерние элементы наследуютallow, если только у дочернего элемента явно не указанdeny. Таким образом, разрешен ие родительского меню открывает доступ к его дочерним элементам. - Если у родительского меню нет явного разрешения, но хотя бы один дочерний элемент имеет
allow, то родительское меню рассматривается как имеющееallow, чтобы пользователи могли получить доступ к этому дочернему элементу.
1.6 Отказ и наследование ролей
- Явный отказ имеет приоритет: если роль явно запрещена в отношении меню, любая роль, наследующая от неё, также получает запрет. Отказ не переопределяется механизмом наследования.
- Неявный отказ (отсутствие правила
allow) можно переопределить: более привилегированная роль может добавить явное правилоallowдля этого меню.
1.7 Пример политики
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. Применение разрешений для меню
В примере jCasbin menu permission класс MenuService предоставляет методы findAccessibleMenus() (все меню, видимые пользователю) и checkMenuAccess() (проверка доступа к одному меню). Оба метода используют enforcer jCasbin под капотом.
Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.