我想知道如何使用ajax xhr请求检查用户是否已登录Symfony(4.x)的最佳方法是什么?目前,我正在使用控制器动作(以处理成功响应)和事件订阅者(如果用户试图在未登录时尝试访问控制器动作,则防止重定向到登录表单)的组合。有没有更好的方法来解决这个问题?
答案 0 :(得分:2)
当前,我正在使用控制器动作(以处理成功响应)的组合
我认为是这样的
/**
* @Route("/me/")
*/
public function meAction(): JsonResponse
{
return new JsonResponse([
'authenticated' => $this->getUser() !== null,
]);
}
事件订阅者(如果用户是 尝试在未登录时访问控制器操作)
您只需在security.yml中添加以下行
access_control
- { path: ^/me/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
确保在进行其他任何访问检查之前将其添加,这将告诉防火墙允许对此路径进行匿名访问。
还要确保为防火墙启用了匿名访问
firewalls:
secured_area:
anonymous: true
拥有anonymous: true
并没有错,但是如果出于某些原因您不想允许它并且仍然避免重定向,则可以实现自定义Entry Point
class XhrAuthenticationEntryPoint implements AuthenticationEntryPointInterface
{
/**
* {@inheritdoc}
*/
public function start(Request $request, AuthenticationException $authException = null)
{
return new JsonResponse(
['authenticated' => false],
200 // can be 200 or 401 up to you.
);
}
}
然后将其添加到您的配置中
// services.yml
Security\XhrAuthenticationEntryPoint: ~
// security.yml
firewalls:
secured_area:
entry_point: Security\XhrAuthenticationEntryPoint