如何告诉yii2注销已登录系统的特定用户?
比方说,有2个用户登录系统,userA
并且userB
.
如何指定退出userB
?
我所知道的是userB必须触发此命令才能注销.
Yii::$app->user->logout(); return $this->goHome();
但也许我们可以使用一些命令Yii::$app->user->logout('userB');
?
或者它有其他方式吗?
好吧,问题是关于如何杀死用户的所有会话.
您可以force_relogin
向User
身份类添加其他列,并true
在需要注销某人时将其设置为:
$user = User::findByLogin('userB'); $user->force_logout = 1; $user->save();
然后在用户组件上添加事件处理程序beforeLogin(),如下所示:
'user' => [ 'class' => 'yii\web\User', 'on beforeLogin' => function ($event) { if ($event->identity->force_logout && $event->cookieBased) { $event->isValid = false; } }, 'on afterLogin' => function ($event) { if ($event->identity->force_logout) { $event->identity->force_logout = false; $event->identity->save(); } } ]
检查是否$cookieBased
和$identity->force_logout
在等...
但这是一个坏主意,因为用户可能有多个会话(在不同的浏览器中登录)
user_sessions
使用user_id
和session_id
列创建表并保存每个会话,在DB中为该用户打开.您可以找到用户的所有会话并逐个删除它们.类似的东西:(代码没有经过测试,只是作为一个想法)
$sessionId = Yii::$app->session->getId(); session_commit(); foreach (UserSessions::findByUserLogin('userB') as $session) { session_id($session->id); session_start(); session_destroy(); session_commit(); } session_id($sessionId); // Restore original session session_start(); session_commit();
这个想法很薄弱,因为你总是应该关注服务器和数据库中会话的一致性.
存储会话是数据库,如Yii2会话处理指南中所述
然后你可以在数据库中找到会话并直接删除它.您不应该关注一致性和会话轮换,因为DB是存储会话的唯一位置.作为免费奖金,您可以通过会话获得非阻止性工作.