Как правильно обрабатывать вызов 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));
    }
}
Другие вопросы по тегам