Symfony2:如何在控制器中手动注销用户?
我想在控制器中做这样的事情来注销用户:
$user = $this->get('security.context')->getToken()->getUser(); $user->logOut();
在Symfony2中注销是由所谓的注销处理程序处理的,这个注销处理程序只是一个在安全configuration的URL匹配模式时执行的列表程序。 如果URL是/logout
那么这个监听器就会被执行。 有两个内build注销处理程序:
- CookieClearingLogoutHandler只是清除所有的Cookie。
- 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); }