Изменение разрешений на основе данных объектов
Событие OBJECT_GET_PRE_SEND_DATA можно использовать для манипулирования ответом сервера перед тем, как данные объекта будут отправлены в интерфейс панели управления Pimcore (Backend UI) при открытии детального вида объекта.
Сценарий использования: Представьте следующую ситуацию: ваша PIM-система агрегирует данные о товарах из разных источников (например, из нескольких ERP-систем разных дочерних компаний) и объединяет их в единое иерархическое дерево объектов. Это удобно, так как все редакторы могут видеть все товары в одном месте.
Однако, когда дело доходит до редактирования, не все пользователи должны иметь право изменять любые товары. Права на редактирование должны зависеть от того, из какой ERP-системы поступил конкретный товар. Поскольку товары объединены в одну структуру дерева, настройка таких прав стандартными средствами может быть сложной, особенно если объекты перемещаются по дереву.
Решение
- Определите дополнительные разрешения, добавив дополнительные записи в таблицу
users_permission_definitions. Эти разрешения станут видимыми, и их можно будет настроить в параметрах прав пользователей и ролей.
- Используйте событие
OBJECT_GET_PRE_SEND_DATA, чтобы «на лету» изменять права пользователя на основе данных объекта (например, его происхождения) при открытии объекта. Для реализации создайте Event Listener со следующим содержимым:
config/services.yaml
services:
app.event_listener.my_event_listner:
class: App\EventListener\MyEventListener
arguments:
- '@Pimcore\Security\User\UserLoader'
tags:
- { name: kernel.event_listener, event: pimcore.admin.dataobject.get.preSendData, method: checkPermissions }
src/EventListener/MyEventListener
<?php
namespace App\EventListener;
use ...
class MyEventListener
{
protected UserLoader $userLoader;
public function __construct(UserLoader $userLoader)
{
$this->userLoader = $userLoader;
}
public function checkPermissions(GenericEvent $event): void
{
$object = $event->getArgument("object");
if($object instanceof Product) {
//Данные, которые отправляются в интерфейс Pimcore
$data = $event->getArgument("data");
//Определяем источник продукта
$origin = 'erp1';
//Получаем текущего пользователя
$user = $this->userLoader->getUser();
//Проверяем наличие специального разрешения и, если его нет, ограничиваем права
if(!$user || !$user->isAllowed("editing_origin_$origin")) {
$data['userPermissions']['save'] = false;
$data['userPermissions']['publish'] = false;
$data['userPermissions']['unpublish'] = false;
$data['userPermissions']['delete'] = false;
$data['userPermissions']['create'] = false;
$data['userPermissions']['rename'] = false;
}
$event->setArgument("data", $data);
}
}
}
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.