Yii2:用户修改密码后退出所有浏览器


Yii2: logout from all browser after a user change password

我想在用户更改当前密码时将其从所有浏览器注销。在将新密码保存到数据库后,我已将代码放入控制器函数中:

$session = Yii::$app->session;
unset($session['id']);
unset($session['timestamp']);
$session->destroy();

它只适用于我更改密码的浏览器。但并非所有浏览器都适用。我已经检查了会话变量- $session['id']是否存在。我可以看到它存在于其他浏览器,即使我从不同的浏览器更改密码

相关问题@github/yii2:

用户保持授权,尽管认证密钥被更改#9718:https://github.com/yiisoft/yii2/issues/9718

这当然是可能的,使用session_id。当用户在其他地方登录时,您可以在为新登录启动新会话之前执行此步骤:

// The hard part: find out what $old_session_id is
    $session = Yii::$app->session;
    unset($session['old_id']);
    unset($session['timestamp']);
    $session->destroy();

// Now proceed to create a new session for the new login

这将破坏服务器端的旧会话,所以当另一台计算机再次访问你的应用程序时,它将尝试访问一个不存在的会话,并将为它创建一个新的会话(其中用户不再登录)。

困难的部分是找出"旧"会话的ID是什么。没有放之四海而皆准的方法;您需要适当的机制来判断id为XXX的会话属于现在正在登录的同一用户。如果您正在使用数据库会话,这应该很容易。

我可以想象你可以通过使用自己的会话处理来做到这一点。

1-更改密码时,您应该设置新的auth_key。

2- Change 'common'model'User

public static function findIdentity($id) {
    if(Yii::$app->getRequest()->getCookies()->has('_identity')){
        $cookie = json_decode(Yii::$app->getRequest()->getCookies()>get('_identity'),true);
        return static::findOne(['id' => $id, 'auth_key' => $cookie[1], 'status' => self::STATUS_ACTIVE]);
    }
}

"_identity"在主配置

中设置identityCookie