当前位置:  开发笔记 > 编程语言 > 正文

Yii2注销特定用户

如何解决《Yii2注销特定用户》经验,为你挑选了1个好方法。

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

比方说,有2个用户登录系统,userA并且userB.

如何指定退出userB

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

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

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

或者它有其他方式吗?



1> SilverFire..:

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

标记用户强制重新登录

您可以force_reloginUser身份类添加其他列,并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在等...

但这是一个坏主意,因为用户可能有多个会话(在不同的浏览器中登录)

在DB中存储列表用户的会话

user_sessions使用user_idsession_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();

这个想法很薄弱,因为你总是应该关注服务器和数据库中会话的一致性.

在DB中存储会话

存储会话是数据库,如Yii2会话处理指南中所述

然后你可以在数据库中找到会话并直接删除它.您不应该关注一致性和会话轮换,因为DB是存储会话的唯一位置.作为免费奖金,您可以通过会话获得非阻止性工作.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有