2015-03-03 39 views

回答

2

您可以通過覆蓋默認的security.logout_listener服務來實現擴展註銷監聽器。

默認的LogoutListener::requiresLogin(...)方法只檢查請求路徑是否等於防火牆的logout_path設置。

它看起來像這樣:

protected function requiresLogout(Request $request) 
{ 
    return $this->httpUtils->checkRequestPath(
     $request, $this->options['logout_path'] 
    ); 
} 

現在讓我們假設你想如果會話參數logout設置爲true進行註銷。

因此,我們擴展LogoutListener類,並添加我們的自定義requiresLogout()方法與其他邏輯。

namespace Your\Name\Space; 

use Symfony\Component\Security\Http\Firewall\LogoutListener; 
use Symfony\Component\HttpFoundation\Session\SessionInterface; 

class MyLogoutListener extends LogoutListener { 

    /** 
    * Whether this request is asking for logout. 
    * 
    * @param Request $request 
    * 
    * @return Boolean 
    */ 
    protected function requiresLogout(Request $request) 
    { 
     if ($request->getSession()->get('logout')) { 
      return true; 
     } 

     return parent::requiresLogout($request); 
    } 

後來我們乾脆重寫security.logout_listener.class容器參數與我們的自定義類我們config.yml

parameters: 
    security.logout_listener.class: \Your\Name\Space\MyLogoutListener 

現在你可以註銷用戶在...Controller像這裏面:

public function someAction(Request $request) { 

    // ... some logic here 

    if ($condition) {  
     $request->getSession()->set('logout', true); 
    } 
} 
+0

一個非常優雅的解決方案!謝謝,我會試一試。 – 2015-03-03 10:22:45

+0

我沒有時間測試,但它應該像這樣工作。這是你期望的答案是什麼? – nifr 2015-03-03 10:24:01

+0

我在我的用戶實體中有一個屬性,指出是否需要將特定用戶踢出。我可以這樣查詢它:'$ user-> isForceLogout()'。但是,是否有可能讓當前用戶進入該偵聽器?我試過'$ request-> getUser()',但好像總是返回NULL。另外,是否可以通過setter爲這個監聽器注入一些額外的服務?或者更好的方法是使用其他監聽器來首先設置會話變量? – 2015-03-03 10:52:00

相關問題