我想在更改当前密码时从所有浏览器中注销用户。 在将新的passowrd保存到数据库之后,我已将代码放入我的控制器函数中:
$session = Yii::$app->session;
unset($session['id']);
unset($session['timestamp']);
$session->destroy();
它仅适用于我更改密码的浏览器。但不适用于所有浏览器。
我检查了会话变量 - $session['id']
是否存在。即使我从不同的浏览器更改密码,我也可以看到它存在于其他浏览器中。
答案 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的名称