Symfony實現了用戶註銷和cookie查殺功能。有一個LogoutListener
代表這些行動的夫婦註銷處理程序:CookieClearingLogoutHandler
和SessionLogoutHandler
。如何使用Symfony 2的內部處理程序將用戶註銷Symfony 2應用程序
如果我們想手動將用戶從應用程序中註銷,我認爲最好的方法是調用這些處理程序,而不是自己實現(重複)這樣的低級邏輯。
有沒有可能這樣做?
Symfony實現了用戶註銷和cookie查殺功能。有一個LogoutListener
代表這些行動的夫婦註銷處理程序:CookieClearingLogoutHandler
和SessionLogoutHandler
。如何使用Symfony 2的內部處理程序將用戶註銷Symfony 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);
}
}
一個非常優雅的解決方案!謝謝,我會試一試。 – 2015-03-03 10:22:45
我沒有時間測試,但它應該像這樣工作。這是你期望的答案是什麼? – nifr 2015-03-03 10:24:01
我在我的用戶實體中有一個屬性,指出是否需要將特定用戶踢出。我可以這樣查詢它:'$ user-> isForceLogout()'。但是,是否有可能讓當前用戶進入該偵聽器?我試過'$ request-> getUser()',但好像總是返回NULL。另外,是否可以通過setter爲這個監聽器注入一些額外的服務?或者更好的方法是使用其他監聽器來首先設置會話變量? – 2015-03-03 10:52:00