【问题标题】:Cross-domain authentication not stored in Symfony2跨域身份验证未存储在 Symfony2 中
【发布时间】:2016-02-25 09:48:47
【问题描述】:

我有一个jQuery AJAX 请求:

    $.ajax({
        type: "POST",
        url: 'http://xbo.dev/ajax/login_ajax',
        dataType: 'json',
        data: {
            _username: $('#_username').val(),
            _password: $('#_password').val()
        }
    }).done(function (data) {
        console.log(data);
    }

还有一个PHP 控制器:

    public function loginAjaxAction() {
        $request = $this->get('request');

        $success = false;
        $responseCode = 300;
        $authorizedHostsDev = array('xbo.dev');

        if ($request->isMethod('POST') && ($request->isXmlHttpRequest() || in_array($request->headers->get('host'), $authorizedHostsDev))) {
            $user = $this->get('fos_user.user_manager')->findUserBy(array('username' => $request->request->get('_username')));

            if ($user) {
                $encoderManager = $this->get('security.encoder_factory');
                $encoder = $encoderManager->getEncoder($user);
                $encodedPass = $encoder->encodePassword($request->request->get('_password'), $user->getSalt());

                if ($user->getPassword() === $encodedPass) {

                    if ($user->getExpiresAt() < new \DateTime()) {
                        $responseCode = 500;
                    } else {
                        $this->userAuthentication($user);

                        $responseCode = 200;
                        $success = true;
                    }
                } else {
                    $responseCode = 400;
                }
            }

        }
        $return = json_encode(array('responseCode' => $responseCode, 'success' => $success));
        return new Response($return, 200, array('Content-Type'=>'application/json'));
    }

如果我从 xbo.dev 执行这个 AJAX 请求,我会在 console.log(data) 中得到这个结果:

{"responseCode":200,"success":true}

之后,我被重定向并登录。

如果我从 blog.xbo.dev 之类的子域执行此 AJAX 请求,我在 console.log(data) 中会得到相同的结果,但是当页面刷新时,我没有被重定向(我停留在连接页面上)并且似乎我的登录操作没有进行(仍然可以输入我的 id 进行连接)。

如何改变这种行为?

谢谢

编辑:我刚刚在PHP 控制器中添加了一项测试,以了解我当时是否已连接。事实上,即使在来自 blog.xbo.dev 的AJAX 请求之后,$responseCode 也是1000。测试:

if ($this->getUser()) {
    $responseCode = 1000;
} else {
    $responseCode = 200;
    $success = true;
}

编辑 2:这是 userAuthentication 方法的代码:

private function userAuthentication(UserInterface $user) { 
    $providerKey = 'main'; // firewall name
    $token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles());

    $this->container->get('security.context')->setToken($token);
}

【问题讨论】:

  • 底部的调试栏说什么,你是用用户登录的吗?
  • 使用 xbo.dev,是的,但使用 blog.xbo.dev,我仍然是匿名的。
  • 当您尝试从 blog.xbo.dev 登录时,您并没有同时登录 xbo.dev 和 blog.xbo.dev 是吗?
  • 是的,没错,但是如果我尝试从 xbo.dev 登录,我会同时登录 xbo.dev 和 blog.xbo.dev
  • @deeznutz :我刚刚用一个测试编辑了我的问题。

标签: php jquery ajax symfony cross-domain


【解决方案1】:

这是我找到的解决方案。

我从我的子域 blog.xbo.dev 中发现,我的 PHP 控制器无法为我的认证用户设置 cookie。

所以,我只是考虑了一下,决定专门为我的子域创建一个不同的路由。

我在 routing.yml 中精确了 host 参数。

所以,我有一个用host: blog.xbo.dev 调用的路由,第二个用host: xbo.dev 调用的路由。两条路由都针对相同的 PHP 控制器函数 (loginAjaxAction),并且运行良好。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2012-05-24
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2012-03-10
    • 2013-02-11
    • 1970-01-01
    相关资源
    最近更新 更多