Symfony,在控制器中强制注销

Posted

技术标签:

【中文标题】Symfony,在控制器中强制注销【英文标题】:Symfony, force logout in a controller 【发布时间】:2019-03-31 01:08:13 【问题描述】:

我正在使用 Symfony 3.4,我想在我的控制器中的操作结束时注销我的用户。

这是动作

public function changeUserEmail() 
     /* change the user email */
     /* perform the logout */
     /* choose the route to redirect to */
     return $this->redirectToRoute(/* some route choosen above */);

有没有办法以 Symfony 的方式实现/* perform the logout */?我在文档中一无所获。 我确实想在控制器中注销(不想重定向到注销路径)并且我想选择要在控制器中重定向的路由。

非常感谢。

版本或 Symfony 是 3.4

【问题讨论】:

How can one force logout a user in Symfony?的可能重复 我认为您可以将安全上下文令牌设置为空,然后使会话无效。使用 php 时更像是一个 Laravel 人,但理论上这应该可以工作 【参考方案1】:

这就是答案

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

// ...

public function changeUserEmail(TokenStorageInterface $tokenStorage) 
     /* change the user email */
     $tokenStorage->setToken();
     /* choose the route to redirect to */
     return $this->redirectToRoute(/* some route choosen above */);

无需使所有会话无效,例如如果定义了多个防火墙。

【讨论】:

也使用 Symfony 4 不确定这是否应该存在于控制器中。一些随机控制器将令牌存储设置为空似乎有点不合适?为什么不直接重定向到应用程序的注销处理程序? @James 因为我不能相信用户会遵循重定向这一事实,并且因为我确实想选择控制器内的路由。 是的,控制器应该决定发送到的最终路由。但是设置令牌属于身份验证或安全层,这是一个新类,可以在不同的地方调用以设置(或清空)用户的令牌 - 或使用应用程序的注销处理程序。如果您在注销或其他方面遇到随机问题/错误,则查看您的控制器以查看用户可能已注销的位置是很烦人的。

以上是关于Symfony,在控制器中强制注销的主要内容,如果未能解决你的问题,请参考以下文章

如何强制用户注销 symfony2

Symfony 强制参数缺失

Symfony 3.1:找不到路径“/logout”的控制器

如何从应用程序远程强制注销firebase auth用户

[Symfony 5]注销后的确认信息

启用“记住我”时,在 Symfony 2 应用程序中注销用户