2012-05-14 15 views
6

Bir Güvenlik Duvarı içinde ajax json çağrıları yapmak için FOSRestBundle'ı kullanıyorum. Bir oturum zaman aşımı gerçekleştiğinde ele alamadığım istisna ile her şey harika çalışıyor gibi görünüyor. Şu anda bu senaryoda login_check'e yönlendiriyor, müşteriye json yerine html döndürüyor.Oturum zaman aşımı için bir symfony2 olayı/işleyicisi var mı a.k.a oturum açmadı

Uygulamamın farkındayım ve success_handler ve failure_handler'ı kullanıyorum. Oturum zaman aşımı gibi yetkilendirme başarısızlıklarıyla uğraşmak için yerleşik bir işleyici bulamıyorum.

FOSRestBundle içinde, bu sorunu veya Symfony2 içinde göremediğim bir yere yardımcı olabilecek bir şey var mı?

cevap

5

Evet, Symfony istisnaları işleme olanağı sunar. Yüksek önceliğe sahip kernel.exception etkinliğini gözlemleyen bir etkinlik dinleyicisi oluşturmanız gerekir. Böyle bir olay işleyicisi oluşturun:

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

Not kullanılan priority parametre,:

<?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(); 
    } 
} 

Şimdi böyle, senin service.yml biri 'ler olay işleyicinizi kayıt var Symfony'e, işleyiciyi daha düşük önceliğe sahip kendi işleyicilerinden önce yürütmesini söylemek.

Ve ön ucunda jQuery için bu tür bir hatayla sayfayı yeniden yükleyen bir olay işleyicisi kaydedebilirsiniz.

Referans için bkz this gist.

İlgili konular