首页 > 解决方案 > 如何检查用户是否在 Symfony 中使用 ajax 登录?

问题描述

我想知道如何检查用户是否使用 ajax xhr 请求登录 Symfony (4.x) 的最佳方法是什么?目前,我正在使用控制器操作(处理成功响应)和事件订阅者(如果用户在未登录时尝试访问控制器操作,则防止重定向到登录表单)的组合。有没有更好的方法来处理这个?

标签: phpsymfonyauthentication

解决方案


目前我正在使用控制器操作的组合(处理成功响应)

我认为它是这样的

/**
 * @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,但是如果由于某种原因您不想允许它并且仍然避免重定向 - 您可以实现自定义入口点

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

推荐阅读