2015-11-23 2 views
2

У меня есть jQueryAJAX запрос:аутентификации Междоменное не хранится в Symfony2

$.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')); 
    } 

Если я выполнить этот AJAX запрос от xbo.dev, у меня есть этот результат в документе console.log(data):

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

После этого я перенаправлен и я вошел в системе.

Если я выполнить этот запрос AJAX от субдомена blog.xbo.dev, у меня есть один и тот же результат в console.log(data) но, когда страница освежает, я 'm не перенаправлен (я остаюсь на странице подключения), и кажется, что мое действие для входа не создано (все равно можно ввести мои идентификаторы для подключения).

Как я могу изменить это поведение?

Благодаря

EDIT: Я добавил один тест, чтобы знать, если я был связан в данный момент в контроллере PHP. Действительно, даже после запроса AJAX от blog.xbo.dev, $responseCode - 1000. Тест:

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

EDIT 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); 
} 
+0

Что говорит панель отладки внизу, вы вошли в систему как пользователь? – Dheeraj

+0

С xbo.dev, да, но с blog.xbo.dev, я все еще анонимный. –

+0

, когда вы пытаетесь войти в систему с blog.xbo.dev, вы не вошли в систему BOTH xbo.dev и blog.xbo.dev, это правильно? – Dheeraj

ответ

1

Вот решение я нашел.

Я понял, что из моего субдомена blog.xbo.dev мой PHP контроллер не смог установить cookie для моего аутентифицированного пользователя.

Итак, я просто подумал об этом и решил специально создать другой маршрут для моего поддомена.

Я уточнил параметр host в своем routing.yml.

Итак, у меня есть один маршрут, который называется host: blog.xbo.dev, а второй - host: xbo.dev. Оба из двух маршрутов нацелены на одну и ту же функцию контроллера PHP (loginAjaxAction), и она отлично работает.

Надеюсь, это поможет.

Смежные вопросы