Вызвать операцию по умолчанию платформы API из настраиваемой?

Я работаю над зоной безопасности. Потратив несколько дней на документацию по Symfony и API-платформе, я понял, что меня беспокоит именно это. Говоря о безопасности в Symfony, я считаю, что это круто для небольших или внутренних проектов. Мы можем добавлять / удалять профили / роли по своему усмотрению.

Я хочу сделать что-то особенное. Я хочу, чтобы пользователь или клиент (не являющийся разработчиком) мог через бэк-офис добавлять новые профили и назначать права. Я использую зону безопасности вместо ролей напрямую. Я хочу защитить свои действия (контроллер) в зоне безопасности.

Каждый контроллер получает метод getSecurityZone (), который может позволить мне сначала проверить это (событие onkernel), чтобы узнать, есть ли у текущего пользователя права (в зависимости от его уникальной роли / профиля) на ресурс.

public function securityZone(): string
{
    return 'BO_ZONE';
}

Мое беспокойство: я не хочу переписывать логику для получения данных, поскольку платформа API уже делает это. Поэтому я попытался использовать событие для проверки безопасности. Кажется, работает, но как вызвать операцию по умолчанию (например, GET) из моего действия?

Моя сущность:

 *      },
 *      collectionOperations={
 *          "get"={
 *              "method"="GET",
 *              "path"="/users",
 *              "controller"=UserListAction::class,
 *              "defaults"={"_api_receive"=false},
 *              "swagger_context"={
 *                  "parameters"={
 *
 *                  }
 *              },
 *          },
 *          "post"
 *      }
 * )
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="users")
 */
class User implements UserInterface
{

Мой слушатель событий:

public static function getSubscribedEvents()
{
    return [
        KernelEvents::VIEW => ['encodePassword', EventPriorities::PRE_WRITE],
        KernelEvents::CONTROLLER => ['micheckSecurity', EventPriorities::PRE_READ],
    ];
}

//..

public function micheckSecurity(FilterControllerEvent $event)
{
    $controller =  $event->getController();
    $method = $event->getRequest()->getMethod();

    if (Request::METHOD_GET !== $method || $controller->getSecurityZone() !== Constants::SECZONE_BO_ZONE)
        throw new AccessDeniedException("You are not author", 500);
    return;
}

И мое действие (контроллер):

class UserListAction
{
    public function __invoke()
    {
        //Call default operation which return collection
    }

    public function securityZone(): string
    {
        return 'BO_ZONE';
    }

}

В моем методе _invoke () я хочу вызвать метод чтения платформы API, который автоматически вернет коллекцию.

Спасибо за Ваше внимание.


person Duhamel    schedule 15.03.2019    source источник
comment
Возможный дубликат Где хранятся операции платформы API по умолчанию?   -  person Martin Paucot    schedule 21.03.2019