繁体   English   中英

Yii2 注销特定用户

[英]Yii2 Logout Specific User

如何告诉 yii2 注销已登录系统的特定用户?

假设有 2 个用户登录系统, userAuserB

如何指定已注销的userB

我所知道的是 userB 必须触发此命令才能注销。

Yii::$app->user->logout();
return $this->goHome();

但也许我们可以使用一些命令,如Yii::$app->user->logout('userB'); ?

或者它有其他方式吗?

好吧,问题是关于如何杀死用户的所有会话。

标记用户强制重新登录

您可以在User身份类中添加额外的force_relogin列,并在需要注销某人时将其设置为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_idsession_id列创建表user_sessions并保存每个会话,您在数据库中为该用户打开。 可以找到用户的所有会话并一一删除。 类似的东西:(代码未经测试,只是一个想法)

$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 是存储会话的唯一地方。 作为免费奖励,您可以获得会话的非阻塞工作。

如果您使用模型User来存储身份验证凭据,您可以简单地将“id”(以及键“100”)的值更改为其他一些整数值,以使用户在下一次请求时身份验证失败。

换句话说,您必须在此代码中更改所有“100”,例如更改为“200”:

文件:/models/User.php

private static $users = [
    '100' => [
        'id' => '100',
        'username' => 'admin',
        'password' => 'password_for_admin',
        'authKey' => '43e02a0f0e5f6a7907b2f2c69a765be7',
        'accessToken' => '7b2f2c69a765be743e02a0f0e5f6a790',
    ],
];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM