如何告诉yii2注销登录系统的特定用户?
假设有2位用户登录系统,userA
和userB
。
如何指定退出userB
?
我所知道的是userB必须触发此命令才能注销。
Yii::$app->user->logout();
return $this->goHome();
但也许我们可以使用像Yii::$app->user->logout('userB');
这样的命令?
或者它有其他方式吗?
答案 0 :(得分:11)
嗯,问题是关于如何杀死用户的所有会话。
您可以向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
并保存每个会话,您在数据库中为该用户打开。您可以找到用户的所有会话并逐个删除它们。类似的东西:(代码没有经过测试,只是作为一个想法)
$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 Guide for Session handling
中所述然后你可以在数据库中找到会话并直接删除它。您不应该关注一致性和会话轮换,因为DB是存储会话的唯一位置。作为免费奖励,您可以通过会话获得非阻止性工作。
答案 1 :(得分:0)
如果您使用模型User
来存储身份验证凭据,则可以简单地将'id'的值(以及键'100')更改为其他某个整数值,以使用户无法通过身份验证他的下一个请求。
换句话说,您必须在此代码中将所有的“ 100”更改为例如“ 200”:
文件:/models/User.php
private static $users = [
'100' => [
'id' => '100',
'username' => 'admin',
'password' => 'password_for_admin',
'authKey' => '43e02a0f0e5f6a7907b2f2c69a765be7',
'accessToken' => '7b2f2c69a765be743e02a0f0e5f6a790',
],
];