Symfony2:如何在控制器中手动注销用户?

我想在控制器中做这样的事情来注销用户:

$user = $this->get('security.context')->getToken()->getUser(); $user->logOut(); 

在Symfony2中注销是由所谓的注销处理程序处理的,这个注销处理程序只是一个在安全configuration的URL匹配模式时执行的列表程序。 如果URL是/logout那么这个监听器就会被执行。 有两个内build注销处理程序:

  1. CookieClearingLogoutHandler只是清除所有的Cookie。
  2. SessionLogoutHandler使会话失效

你所要做的就是最后一个一样。 你可以通过简单地调用:

遗产Symfony

 $this->get('security.context')->setToken(null); $this->get('request')->getSession()->invalidate(); 

Symfony 2.6

 $this->get('security.token_storage')->setToken(null); $this->get('request')->getSession()->invalidate(); 

警告

这只有在记住我function被禁用时才有效。 在其他情况下,用户将通过记住我的cookie再次login到下一个请求。

请考虑扩展解决scheme,如果您使用记住我的function: https : //stackoverflow.com/a/28828377/1056679

注销时,我们必须将用户设置为匿名用户。 那我们可以使用
$token->getUser()->getRoles(); 在控制器或{% if is_granted('ROLE_USER') %}在树枝模板。

 use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken; ... //$providerKey = $this->container->getParameter('fos_user.firewall_name'); $token = new AnonymousToken($providerKey, 'anon.'); $this->get('security.context')->setToken($token); $this->get('request')->getSession()->invalidate(); 

使用户会话无效可能会导致一些不需要的结果。 Symfony的防火墙有一个监听器,它总是检查和刷新用户的令牌。 您可能只是redirect到您在firewall.yml中指定的默认注销路由

在控制器中,你可以这样做:

 $this->redirect( $this->generateUrl( 'your_logout_url' ) ); 

如果您不知道注销路由的名称。 你可以在控制台中检查它:

 app/console router:match /logout 

这个命令会给你你需要的路由名称。

🙂

如果为您的网站启用了remembermefunction,则还应该清除rememberme cookie:

  $this->get('security.context')->setToken(null); $this->get('request')->getSession()->invalidate(); $response = new RedirectResponse($this->generateUrl('dn_send_me_the_bundle_confirm', array( 'token' => $token ))); // Clearing the cookies. $cookieNames = [ $this->container->getParameter('session.name'), $this->container->getParameter('session.remember_me.name'), ]; foreach ($cookieNames as $cookieName) { $response->headers->clearCookie($cookieName); }