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'] 是否存在。即使我从不同的浏览器更改密码后,我也可以看到它存在于其他浏览器中。

当然可以,使用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

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

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

我可以想象您可以通过使用自己的会话处理来做到这一点。如果您将会话存储在数据库中。

相关问题@github/yii2:

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

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

2-更改\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 之前的名字