【发布时间】: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