在Symfony 4防火墙后处理AJAX呼叫的正确方法是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (47)

我需要将AJAX请求发送到我的用户通过身份验证的网站部分。不幸的是,Symfony 4拒绝这些请求(并将它们发送到登录页面),因为它没有将它检测为对我的控制器/路由的认证访问。

你如何确保你的Ajax请求通过Symfony 4访问控制?在我的security.yaml中,我配置了以下安全性:

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

我需要通过ajax调用访问/配置文件/更新。我如何提供symfony的凭据?

提问于
用户回答回答于

你的控制器方法将Ajax调用重定向到登录页面,因为你的JS不会发送凭据(读取:cookie)。

如果你使用抓取,请使用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));
    }
}

扫码关注云+社区

领取腾讯云代金券