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

Построение системы ролей и прав для фронтенда

Типичный сценарий использования приложений на Pimcore — это порталы с авторизацией пользователей и сложной структурой прав доступа (например, B2B-порталы).

Один из способов реализации — использование стандартного функционала Symfony Security с конфигурацией контроля доступа и ACL, как описано здесь.

Однако часто бывает удобно предоставить администраторам возможность самостоятельно настраивать и поддерживать права пользователей. Для этой цели отлично подходят объекты данных (Data Objects) Pimcore. Вы можете создать объект пользователя и определить разрешения (permissions) непосредственно в нем или через связи с другими объектами ролей, назначенными этому пользователю.

Как интегрировать объекты Pimcore, систему ролей и лучшие практики Symfony для реализации сложных структур разрешений на фронтенде?

Решение

Настройка аутентификации пользователя с помощью Symfony Security и Pimcore объектов

О том, как в целом интегрировать объекты Pimcore с системой безопасности Symfony, читайте в документации Pimcore. Там описано, как настроить аутентификацию на основе объекта пользователя.

Настройка разрешений пользователей через объекты Pimcore

Для настройки разрешений непосредственно внутри объектов пользователей используйте расширение Frontend Permission Toolkit и входящий в него тип данных permissionResource. Тип данных разрешение

permissionResource представляет собой конкретное право пользователя (например, «вход», «просмотр цен», «заказ») и может принимать значения allow, deny и inherit.

  • allow: У пользователя есть это разрешение.
  • deny: У пользователя нет этого разрешения.
  • inherit: Разрешение унаследовано от связанных других объектов разрешения (см. далее).

В дополнение к настройке permissionResources непосредственно в пользовательском объекте, можно создать дополнительные классы объектов (например, UserRole) и связать объект с типом UserRole с пользовательскими объектами.

UserRole может выглядеть примерно так, как показано в следующем примере, и содержать permissionResources для себя. Пользовательский класс роли

Объекты UserRole могут иметь permissionResources с именами, подобными этим в объекте пользователя (в этом случае значения объединяются, как описано ниже), или могут иметь дополнительные permissionRessources.

Для связи ролей с пользователями используйте специальные типы данных Permission Objects или Permission Href вместо стандартных связей. Это позволит сервису Frontend Permission Toolkit рекурсивно собирать все разрешения для конкретного пользователя.

Для создания сложных структур разрешений можно использовать объекты Pimcore.

Сервис Frontend Permission Toolkit предоставляет два метода для работы:

  • Service::getPermissions:
  • возвращает массив всех разрешений для объекта (например, пользователя), автоматически объединяя все permissionResources из связанных объектов через Permission Objects или Permission Href.
    • Логика объединения: если разрешение установлено в allow или deny непосредственно в объекте пользователя, используется оно. В противном случае применяется «оптимистичное слияние»: если хотя бы одна роль разрешает действие, оно считается разрешенным. Сопоставление идет по имени поля.
  • Service::isAllowed: проверяет, разрешен ли доступ к конкретному ресурсу для данного объекта.
Интеграция прав во фронтенд-часть

Существует несколько способов интеграции настроенных разрешений в ваш код:

  1. Используйте сервис Frontend Permission Toolkit в коде вашего приложения, чтобы проверить, разрешен ли пользователю доступ к определенному ресурсу:
    //Получаем объект пользователя из Symfony  
$userObject = $this->get('security.token_storage')->getToken()->getUser();

//Получаем сервис разрешений из контейнера
$permissionService = \Pimcore::getContainer()->get("bundle.frontendpermissiontoolkit.service");

if($permissionService->isAllowed($userObject, "order")) {
//Выполняем логику, например, показываем кнопку оформления заказа...
}


  1. Интеграция permissionResources в Symfony Security как Роли (Roles): Существует несколько способов интегрировать разрешения объекта permissionResource в систему безопасности Symfony. Одним из них может быть реализация Symfony Voters, как описано здесь. Самым простым (но, возможно, не самым красивым) способом было бы вернуть все разрешенные permissionResources объекта пользователя в качестве ролей этого пользователя. В этом случае вы можете получить доступ к этой информации везде в Synfony framework. Подробности смотрите в документации Frontend Permission Toolkit
  2. Интегрируйте permissionResources в документы и навигацию по Pimcore: Подробнее смотрите в разделе Frontend Permission Toolkit.

Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.