Symfony как использовать аннотацию @Security

#symfony

#symfony

Вопрос:

Я не могу найти никаких четких сообщений о том, как использовать аннотацию @Security symfony. Какие параметры я могу использовать? И самое главное, как я могу защитить контроллер от гостей и сделать его доступным только для пользователей?

В настоящее время у меня есть

 /**
 * 
 * @Route("/reseller/create/", name="app_reseller_create", methods={"POST", "GET"})
 * @IsGranted("ROLE_ADMIN")
     */
public function create(Request $request): Response
{
}
 

Ответ №1:

@isGranted

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

 /**
 * @IsGranted("IS_AUTHENTICATED_FULLY")
 */
class MyClass {
 

Есть некоторые специальные атрибуты, которые можно использовать везде, где вы можете использовать ROLE_ .

  • IS_AUTHENTICATED_FULLY выполнен вход в систему.
  • IS_AUTHENTICATED_REMEMBERED авторизован или имеет сохраненный файл cookie.
  • IS_AUTHENTICATED_ANONYMOUSLY у любого пользователя есть это
  • IS_ANONYMOUS только гости
  • IS_REMEMBERED только пользователи с сохраненным файлом cookie
  • IS_IMPERSONATOR только пользователи, которые выдают себя за другого пользователя в сеансе.

Атрибуты IS_ANONYMOUS , IS_REMEMBERED и IS_IMPERSONATOR были введены в Symfony 5.1.

@Безопасность

Аннотация безопасности является более гибкой, чем предоставленная аннотация, и может использовать выражения.

Допустим, вам нужна страница, доступ к которой возможен только в том случае, если пользователь является администратором и имеет определенный токен в своем запросе.

  • с @IsGranted
 /**
 * @IsGranted("ROLE_ADMIN", statusCode=404)
 */
 public function show(Request $request, Post $post) 
 {
     if (!$request->request->has('privatetoken') || 'mytoken' !== $request->request->get('privatetoken')) {
        return $this->createNotFoundException('not found');
     }

     // Show Post
 }
 
  • с @Security
 /**
 * @Security("is_granted('ROLE_ADMIN') and request.get('privatetoken') == 'mytoken'", statusCode=404)
 */
 public function show(Post $post)
 {
     // Show Post
 }
 

При этом у вас должна быть роль администратора и privatetoken параметр в вашем URL, например mydomain.com/post/show/?privatetoken=mytoken , и вам не нужен экземпляр запроса.

Выражение имеет доступ к следующим переменным:

  • token : Текущий токен безопасности;
  • user : Текущий пользовательский объект;
  • request : Экземпляр запроса;
  • roles : Роли пользователей;
  • и все атрибуты запроса.

Слишком много возможностей опубликовать все это. но я думаю, что это показывает разницу с @isGranted.

Документы Symfony

Комментарии:

1. Спасибо, что поделились! Мне понадобится способ для моего API. Я думаю, что токен будет работать для этого. Но я был бы рад, если бы у вас была рекомендация

2. если вы создаете свой api с помощью api-platform, это то же самое. Взгляните на: api-platform.com/docs/core/security