#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
только пользователи с сохраненным файлом cookieIS_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.
Комментарии:
1. Спасибо, что поделились! Мне понадобится способ для моего API. Я думаю, что токен будет работать для этого. Но я был бы рад, если бы у вас была рекомендация
2. если вы создаете свой api с помощью api-platform, это то же самое. Взгляните на: api-platform.com/docs/core/security