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

**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
MenuNameROLE_ROOTROLE_ADMINROLE_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.