Как правильно обрабатывать вызов AJAX за брандмауэром Symfony 4? - PullRequest
0 голосов
/ 26 июня 2018

Мне нужно отправлять запросы AJAX в те части моего веб-сайта, где мой пользователь проходит аутентификацию. К сожалению, Symfony 4 отклоняет эти запросы (и отправляет их на страницу входа в систему), так как не определяет его как аутентифицированный доступ к моему контроллеру / маршруту.

Как убедиться, что ваши ajax-запросы проходят через контроль доступа Symfony 4? В моем security.yaml я настроил безопасность следующим образом:

access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/profile, roles: ROLE_USER }

Мне нужно получить доступ / профиль / обновить с помощью вызова ajax. Как мне предоставить учетные данные Symfony?

Спасибо!

1 Ответ

0 голосов
/ 26 июня 2018

Ваш метод контроллера перенаправляет вызов 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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...