2015-03-03 61 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

相关问题