Я работаю над зоной безопасности. Потратив несколько дней на документацию по 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, который автоматически вернет коллекцию.
Спасибо за Ваше внимание.