Интересно, как лучше всего проверить, зарегистрирован ли пользователь в Symfony (4.x), используя запрос ajax xhr? В настоящее время я использую комбинацию действия контроллера (для обработки успешного ответа) и подписчика событий (чтобы предотвратить перенаправление на форму входа, если пользователь пытается получить доступ к действию контроллера, не войдя в систему). Есть ли лучший способ справиться с этим?
Посмотрите это пожалуйста stackoverflow.com/questions/35125729/…
Также вы можете увидеть stackoverflow.com/questions/10271570/…
@nicolallias нет, это другой случай. И это не дубликат, вопрос, который вы связали, касается проверки без запроса ajax и не предотвратит перенаправление пользователя на форму входа.
Currently I'm using combination of controller action (to handle success response)
Я предполагаю, что это что-то вроде этого
/**
* @Route("/me/")
*/
public function meAction(): JsonResponse
{
return new JsonResponse([
'authenticated' => $this->getUser() !== null,
]);
}
event subscriber (to prevent redirection to login form if user is trying to access controller action while not logged in)
Вы можете просто добавить следующую строку в свой файл security.yml
access_control
- { path: ^/me/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
Обязательно добавьте его перед любыми другими проверками доступа, это сообщит брандмауэру о разрешении анонимного доступа для этого пути.
Также убедитесь, что анонимный доступ включен для вашего брандмауэра.
firewalls:
secured_area:
anonymous: true
нет ничего плохого в наличии anonymous: true
, но если вы по какой-то причине не хотите его разрешать и при этом избегать редиректа - вы можете реализовать кастомный Входная точка
class XhrAuthenticationEntryPoint implements AuthenticationEntryPointInterface
{
/**
* {@inheritdoc}
*/
public function start(Request $request, AuthenticationException $authException = null)
{
return new JsonResponse(
['authenticated' => false],
200 // can be 200 or 401 up to you.
);
}
}
а потом добавить в свои конфиги
// services.yml
Security\XhrAuthenticationEntryPoint: ~
// security.yml
firewalls:
secured_area:
entry_point: Security\XhrAuthenticationEntryPoint
Выглядит хорошо. Но как насчет случая, когда я не хочу иметь анонимный доступ? Понравилась клиентская зона? Допустим, у меня есть целевая страница, которая не должна находиться за брандмауэром, и защищенная область, которая находится за брандмауэром. Я хотел бы знать, вошел ли пользователь в защищенную область, которая всегда anonymous: false
из области без брандмауэра. У меня есть веб-сайт с 4 различными брандмауэрами и одной незащищенной областью.
@Tom, затем измените IS_AUTHENTICATED_ANONYMOUSLY
на роль, которую вы хотите проверить.
Не знаю для Symfony4, но раньше мы могли сделать что-то вроде stackoverflow.com/a/27382547/2375207