Symfony2:如何在控制器中手动记录用户?

Vit*_*lyP 43 symfony

我想在控制器中做类似的事情来记录用户:

$user = $this->get('security.context')->getToken()->getUser();
$user->logOut();
Run Code Online (Sandbox Code Playgroud)

Cro*_*zin 75

Symfony2中的注销由所谓的logout处理程序处理,这只是一个lister,当URL匹配来自安全配置的模式时执行,即.如果让我们说URL,/logout则执行此监听器.有两个内置注销处理程序:

  1. CookieClearingLogoutHandler只清除所有cookie.
  2. SessionLogoutHandler使会话无效

你所要做的就是和最后一个一样.你可以通过简单地调用来实现它:

遗产Symfony

$this->get('security.context')->setToken(null);
$this->get('request')->getSession()->invalidate();
Run Code Online (Sandbox Code Playgroud)

Symfony 2.6

$this->get('security.token_storage')->setToken(null);
$this->get('request')->getSession()->invalidate();
Run Code Online (Sandbox Code Playgroud)

警告

这仅在记住我的功能被禁用时才有效.在其他情况下,用户将通过记住我的cookie以及下一个请求再次登录.

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

  • 您还应该将安全性令牌设置为null:`$ this-> get('security.context') - > setToken(null); $这个 - >获得( '请求') - >的getSession() - >无效();` (14认同)
  • 必须有一些事件可以启动,我不敢相信他们没有一个可靠的方法来保留区域设置并注销用户. (5认同)
  • 注意:从2.4开始,不推荐获取这样的Request对象.将请求注入Controller或用户RequestStack:http://symfony.com/blog/new-in-symfony-2-4-the-request-stack (4认同)

小智 11

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

在Controller中,您可以这样做:

$this->redirect( $this->generateUrl( 'your_logout_url' ) );
Run Code Online (Sandbox Code Playgroud)

如果您不知道注销路线的名称.你可以在控制台中查看它:

app/console router:match /logout
Run Code Online (Sandbox Code Playgroud)

此命令将为您提供所需的路径名称.

:)

  • 如果您想强制注销恶意用户,这只会导致重定向。恶意用户可以简单地忽略 302 响应,并继续进行恶意活动。假设他们在成功会话劫持后尝试更改登录用户的密码。输入错误密码 3 次应该将其注销,但在这里他们可以忽略 302 并尝试无论如何,除非您另外检查错误尝试的次数。底线:您不能像这样强制注销。 (2认同)

Yas*_*ika 9

我们必须在注销时将用户设置为匿名用户.然后我们可以
$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();
Run Code Online (Sandbox Code Playgroud)