У меня есть пример, где я пытаюсь создать вход AJAX с помощью Symfony2 и FOSUserBundle. Я устанавливаю свои success_handler
и failure_handler
под номером form_login
в своем файле security.yml
.Symfony2 AJAX Login
Вот класс:
class AjaxAuthenticationListener implements AuthenticationSuccessHandlerInterface, AuthenticationFailureHandlerInterface
{
/**
* This is called when an interactive authentication attempt succeeds. This
* is called by authentication listeners inheriting from
* AbstractAuthenticationListener.
*
* @see \Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener
* @param Request $request
* @param TokenInterface $token
* @return Response the response to return
*/
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
if ($request->isXmlHttpRequest()) {
$result = array('success' => true);
$response = new Response(json_encode($result));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
}
/**
* This is called when an interactive authentication attempt fails. This is
* called by authentication listeners inheriting from
* AbstractAuthenticationListener.
*
* @param Request $request
* @param AuthenticationException $exception
* @return Response the response to return
*/
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
if ($request->isXmlHttpRequest()) {
$result = array('success' => false, 'message' => $exception->getMessage());
$response = new Response(json_encode($result));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
}
}
Это работает отлично подходит для обработки как успешных и неудачных попыток входа в систему AJAX. Однако, когда включено - я не могу войти в систему через стандартный метод POST (не-AJAX). Я получаю следующее сообщение об ошибке:
Catchable Fatal Error: Argument 1 passed to Symfony\Component\HttpKernel\Event\GetResponseEvent::setResponse() must be an instance of Symfony\Component\HttpFoundation\Response, null given
Я хотел бы, чтобы мои onAuthenticationSuccess
и onAuthenticationFailure
переопределений будет выполняться только для XMLHttpRequests (AJAX запросов) и просто передать исполнение обратно к первоначальному обработчику, если нет.
Есть ли способ сделать это?
TL; DR Я хочу, чтобы AJAX запросил попытки входа в систему вернуть ответ JSON для успеха и неудачи, но я хочу, чтобы он не влиял на стандартный вход через форму POST.
У меня такая же точная проблема. Я задал вопрос здесь: http://stackoverflow.com/questions/8654265/calling-default-handler-from-a-custom-authentication-handler, но на данный момент ответов нет :( –
Там есть отличная статья, объясняющая, как это сделать это здесь: http://www.webtipblog.com/adding-an-ajax-login-form-to-a-symfony-project/ – joe42