Как правильно обрабатывать вызов AJAX за брандмауэром Symfony 4?
Мне нужно отправлять запросы AJAX в те части моего веб-сайта, где мой пользователь проходит аутентификацию. К сожалению, Symfony 4 отклоняет эти запросы (и отправляет их на страницу входа в систему), так как не определяет его как аутентифицированный доступ к моему контроллеру / маршруту.
Как убедиться, что ваши запросы Ajax проходят через контроль доступа Symfony 4? В моем security.yaml я настроил безопасность следующим образом:
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/profile, roles: ROLE_USER }
Мне нужно получить доступ / профиль / обновить с помощью вызова AJAX. Как предоставить учетные данные Symfony?
Спасибо!
1 ответ
Ваш метод контроллера перенаправляет вызов Ajax на страницу входа, потому что ваш JS не отправляет учетные данные (читай: куки).
Если вы используете fetch, используйте credentials
:
fetch(url, {
credentials: "same-origin"
}).then(...).catch(...);
См. https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials
Если вы используете другой способ создания вызова Ajax, обновите ваш вопрос с помощью некоторого кода JS и дайте мне знать:).
Если вы не хотите перенаправлять пользователя на страницу входа при выполнении XMLHttpRequest ('ajax'), используйте этот прослушиватель для отправки ответа 403:
class AjaxAuthenticationListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
KernelEvents::EXCEPTION => [
['onCoreException', 10],
],
];
}
public function onCoreException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();
$request = $event->getRequest();
if (! $request->isXmlHttpRequest()) {
return;
}
if (! ($exception instanceof AuthenticationException) && ! ($exception instanceof AccessDeniedException)) {
return;
}
$event->setResponse(new Response('No access', 403));
}
}