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

Изменение разрешений на основе данных объектов

Событие OBJECT_GET_PRE_SEND_DATA можно использовать для манипулирования ответом сервера перед тем, как данные объекта будут отправлены в интерфейс панели управления Pimcore (Backend UI) при открытии детального вида объекта.

Сценарий использования: Представьте следующую ситуацию: ваша PIM-система агрегирует данные о товарах из разных источников (например, из нескольких ERP-систем разных дочерних компаний) и объединяет их в единое иерархическое дерево объектов. Это удобно, так как все редакторы могут видеть все товары в одном месте.

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

Решение

  1. Определите дополнительные разрешения, добавив дополнительные записи в таблицу users_permission_definitions. Эти разрешения станут видимыми, и их можно будет настроить в параметрах прав пользователей и ролей. Пользовательские разрешения
  2. Используйте событие 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);
}
}
}



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