2012-11-05 41 views
0

我想實現一個自定義的邏輯爲我的用戶實施AdvancedUserInterface抓AccountStatusException

我想允許啓用非用戶訪問某些區域(如該帳戶區,在那裏他們可以,如果改變他們的電子郵件他們犯了一個錯誤)。

根據文檔:

如果有任何在這個接口中的方法返回false,認證 將失敗。

如果您需要爲這些情況執行自定義邏輯,那麼您需要註冊一個異常監聽器,並觀察在每種情況下拋出的特定異常實例。所有的例外是AccountStatusException的 子

所以,我想通過調整this cookbook article到安全事件來創建一個監聽器:

<?php 

namespace Acme\DemoBundle\Listener; 


use Symfony\Component\Security\Core\SecurityContextInterface; 

use Symfony\Component\Security\Core\Exception\AccountStatusException; 

class NecdocPatientExceptionListener 
{ 
    public function onKernelException($event) 
    { 
     // Handle event code goes here 
    } 
} 

而且我已經把它添加到包的的services.xml:

services: 
    kernel.listener.acme_user_exception_listener: 
     class: Acme\DemoBundle\Listener\AcmeExceptionListener 
     tags: 
      - { name: kernel.event_listener, event: security.authentication.success, method: onKernelException } 

這捕獲AuthenticationFailureEvent(該onKernelException被稱爲),但不AccountStatusException(不調用onKernelException)

我一直在尋找安全組件代碼,並且似乎捕獲的異常沒有觸發任何事件。 有沒有辦法來捕捉這些例外嗎?

+0

如果'onKernelException($ event)'函數請添加主體。這個事件監聽器現在不會做任何事情。 –

+0

問題是從不調用onKernelException方法。在這種情況下添加一個主體不會做任何事情。 – Julien

+0

我改變了我的策略,並使用角色訪問而不是實現AdvancedUserInterface,因爲實現看起來像不發送事件... – Julien

回答

0
namespace Acme\DemoBundle\Listener; 

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Security\Core\Exception\AccountStatusException; 

class AcmeExceptionListener 
{ 
    public function onKernelException(GetResponseForExceptionEvent $event) 
    { 
     // We get the exception object from the received event 
     $exception = $event->getException(); 
     $message = 'My Error says: ' . $exception->getMessage() . ' with code: ' . $exception->getCode(); 

     // Customize our response object to display our exception details 
     $response = new Response(); 
     $response->setContent($message); 

     // Checks that the exception is an account status exception 
     if ($exception instanceof AccountStatusException) { 
      $response->setStatusCode($exception->getStatusCode()); 
      $response->headers->replace($exception->getHeaders()); 
     } else { 
      $response->setStatusCode(500); 
     } 

     // Send our modified response object to the event 
     $event->setResponse($response); 
    } 
}