FOSUserBundle AJAX Вход с Symfony2 (маршрутизация)

Я пытаюсь сделать проверку подлинности AJAX с помощью FOSUserBundle.

Я создал каталог Handler с AuthenticationHandler class :

 <?php namespace BirdOffice\UserBundle\Handler; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\Routing\RouterInterface; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\SecurityContextInterface; use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface; class AuthenticationHandler implements AuthenticationSuccessHandlerInterface, AuthenticationFailureHandlerInterface { private $router; private $session; /** * Constructor * * @param RouterInterface $router * @param Session $session */ public function __construct( RouterInterface $router, Session $session ) { $this->router = $router; $this->session = $session; } /** * onAuthenticationSuccess * * @param Request $request * @param TokenInterface $token * @return Response */ public function onAuthenticationSuccess( Request $request, TokenInterface $token ) { // if AJAX login if ( $request->isXmlHttpRequest() ) { $array = array( 'success' => true ); // data to return via JSON $response = new Response( json_encode( $array ) ); $response->headers->set( 'Content-Type', 'application/json' ); return $response; // if form login } else { if ( $this->session->get('_security.main.target_path' ) ) { $url = $this->session->get( '_security.main.target_path' ); } else { $url = $this->router->generate( 'home_page' ); } // end if return new RedirectResponse( $url ); } } /** * onAuthenticationFailure * * @param Request $request * @param AuthenticationException $exception * @return Response */ public function onAuthenticationFailure( Request $request, AuthenticationException $exception ) { // if AJAX login if ( $request->isXmlHttpRequest() ) { $array = array( 'success' => false, 'message' => $exception->getMessage() ); // data to return via JSON $response = new Response( json_encode( $array ) ); $response->headers->set( 'Content-Type', 'application/json' ); return $response; // if form login } else { // set authentication exception to session $request->getSession()->set(SecurityContextInterface::AUTHENTICATION_ERROR, $exception); return new RedirectResponse( $this->router->generate( 'login_route' ) ); } } } 

Я создал функцию login Javascript function для login Javascript function в login Javascript function :

 function login() { $.ajax({ type: "POST", url: Routing.generate('check_login_ajax'), dataType: 'json', data: { _username: $('#username').val(), _password: $('#password').val(), _remember_me: false, _csrf_token: $('#_csrf_token').val() } }).done(function(data) { console.log(data); }).fail(function(data) { console.log(data); }); } 

В моей routingAjax.yml я добавил следующие строки, чтобы переопределить FOSUserBundle security route :

 check_login_ajax: pattern: /check_login_ajax defaults: { _controller: FOSUserBundle:Security:check } requirements: _method: POST options: expose: true 

В моем глобальном файле security.yml я добавил check_path , success_handler и failure_handler :

 firewalls: main: pattern: ^/ form_login: login_path: fos_user_registration_register check_path: check_login_ajax success_handler: user.security.authentication_handler failure_handler: user.security.authentication_handler provider: fos_userbundle csrf_provider: form.csrf_provider logout: path: fos_user_security_logout target: / anonymous: true 

Моя первая проблема: AJAX возвращает это сообщение: «Недопустимый токен CSRF». (но я посылаю хороший, сгенерированный на PHP, возможно, я пропустил что-то такое). Вот мой PHP-код:

 <?php $csrfProvider = $this->container->get('form.csrf_provider'); $csrfToken = $csrfProvider->generateCsrfToken('popUpUser'); ?> 

Вторая проблема: моя страница входа (а не AJAX) больше не работает, потому что был изменен маршрут orignal входа в FOSUserBundle.

PS: Вчера я опубликовал сообщение: FOSUserBundle (логин / регистр) + AJAX + Symfony2, но я плохо объяснил свою проблему. Извините заранее.

Первая проблема: вы отправляете недействительный токен CSRF. В Symfony 2.3 вы можете сгенерировать его с помощью {{ csrf_token('authenticate') }} внутри value input шаблона.

Вторая проблема: не перезаписывайте маршрут, просто используйте оригинальный маршрут: fos_user_security_check .

В общем: если вы используете AuthenticationSuccessHandler расширяющий Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler ваш метод может выглядеть примерно так:

 public function onAuthenticationSuccess(Request $request, TokenInterface $token) { if ($request->isXmlHttpRequest()) { return new JsonResponse(array('success' => true)); } return parent::onAuthenticationSuccess($request, $token); } 

Сделайте что-то подобное для AuthenticationFailureHandler расширяющего Symfony\Component\Security\Http\Authentication\DefaultAuthenticationFailureHandler .