在 Symfony 4 防火墙后处理 AJAX 调用的正确方法是什么?
What’s the proper way to handle an AJAX call behind Symfony 4 firewall?
我需要将 AJAX 请求发送到我的网站中我的用户经过身份验证的部分。不幸的是,Symfony 4 拒绝了这些请求(并将它们发送到登录页面),因为它没有将其检测为对我的 controller/route.
的经过身份验证的访问
您如何确保您的 ajax 请求通过 Symfony 4 访问控制?
在我的 security.yaml 中,我配置了如下安全性:
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/profile, roles: ROLE_USER }
我需要通过 ajax 调用访问 /profile/update。我如何向 symfony 提供凭据?
谢谢!
您的控制器方法将 Ajax 调用重定向到登录页面,因为您的 JS 不发送凭据(读取:cookie)。
如果您正在使用 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));
}
}
我需要将 AJAX 请求发送到我的网站中我的用户经过身份验证的部分。不幸的是,Symfony 4 拒绝了这些请求(并将它们发送到登录页面),因为它没有将其检测为对我的 controller/route.
的经过身份验证的访问您如何确保您的 ajax 请求通过 Symfony 4 访问控制? 在我的 security.yaml 中,我配置了如下安全性:
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/profile, roles: ROLE_USER }
我需要通过 ajax 调用访问 /profile/update。我如何向 symfony 提供凭据?
谢谢!
您的控制器方法将 Ajax 调用重定向到登录页面,因为您的 JS 不发送凭据(读取:cookie)。
如果您正在使用 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));
}
}