2012-05-14 11 views
6

Estoy usando el FOSRestBundle para hacer llamadas ajax json dentro de un firewall. Todo parece funcionar muy bien, con la excepción de que Im no puede manejar cuando se ha producido un tiempo de espera de la sesión. En este momento está redirigiendo a login_check en este escenario, devolviendo html en lugar de json al cliente.¿Hay un evento/controlador symfony2 para el tiempo de espera de la sesión a.k.a no ha iniciado sesión

Soy consciente, y uso success_handler y failure_handler dentro de mi aplicación. No puedo encontrar un manejador incorporado para manejar las fallas de autorización, como el tiempo de espera de la sesión.

¿Hay algo dentro del FOSRestBundle que pueda ayudar a solucionar esto, o algo que no veo en Symfony2?

Respuesta

5

Sí, Symfony ofrece la posibilidad de manejar excepciones. Debe crear un detector de eventos que observe el evento kernel.exception con alta prioridad. Crear un controlador de eventos como éste:

<?php 
namespace Acme\Bundle\MyBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 
use Symfony\Component\HttpFoundation\JsonResponse; 
use Symfony\Component\Security\Core\Exception\AccessDeniedException; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 

class AjaxAuthenticationListener 
{ 
    public function onKernelException(GetResponseForExceptionEvent $event) 
    { 
     $request = $event->getRequest(); 

     $format = $request->getRequestFormat(); 
     $exception = $event->getException(); 
     if ('json' !== $format || (!$exception instanceof AuthenticationException && !$exception instanceof AccessDeniedException)) { 
      return; 
     } 

     $response = new JsonResponse($this->translator->trans($exception->getMessage()), $exception->getCode()); 
     $event->setResponse($response); 
     $event->stopPropagation(); 
    } 
} 

Ahora usted tiene que registrar su controlador de eventos en uno de sus service.yml 's, de esta manera:

kernel.listener.ajax_authentication_listener: 
    class: Acme\Bundle\MyBundle\EventListener\AjaxAuthenticationListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: 250 } 

Nota el parámetro priority, utilizado para decirle a Symfony que ejecute el controlador antes que sus propios manejadores, que tienen una prioridad menor.

Y en su frontend puede registrar un controlador de eventos para jQuery, que vuelve a cargar la página en dicho error.

$(document).ready(function() { 
    $(document).ajaxError(function (event, jqXHR) { 
     if (403 === jqXHR.status) { 
      window.location.reload(); 
     } 
    }); 
}); 

Ver this gist como referencia.

Cuestiones relacionadas