Yii2:用户更改密码后从所有浏览器注销

时间:2015-09-23 08:05:18

标签: php session yii2 change-password

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

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

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

3 个答案:

答案 0 :(得分:1)

使用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的会话属于现在登录的同一用户。如果您正在使用数据库会话,这应该很容易。

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

答案 1 :(得分:0)

相关问题@ github / yii2:

尽管已更改身份验证密钥,用户仍会获得授权#9718: https://github.com/yiisoft/yii2/issues/9718

答案 2 :(得分:0)

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的名称