我想注销在不同浏览器/环境中登录的用户会话,而不是同一用户的当前会话。类似于此的功能- https://www.facebook.com/settings?tab=security§ion=sessions&view.
Yii2是使用的后端框架。使用redis进行会话管理- yii2-redis。我还保存了数据库中保存的会话id。
我跟着这篇文章http://www.codeinphp.com/general/php-code-snippets/remotely-destroy-different-session-php-forced-user-signout/
但是没有成功。
session_id($old_session_id);
session_start(); // This line throws error.
session_destroy();
使用'Yii::$app->session->destroySession($oldSessionId)
删除redis中的key没有注销。
将会话id更改为旧id然后销毁会话也不起作用。
$currentSessionId = 'Yii::$app->session->getId();
'Yii::$app->session->setId($oldSessionId);
'Yii::$app->getSession()->destroy();
'Yii::$app->session->setId($currentSessionId);
如果有人成功地实现了这一点,请分享你的解决方案。此外,如果有任何关于这方面的文档可以帮助,请务必提供。
首先,session_start()
必须在session_id()
之前调用,并且只调用一次
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
session_id($old_session_id);
session_destroy();
但是只是删除会话,如果你允许用户自动登录,这是不够的,因为浏览器会使用cookie自动登录。要解决这个问题,您必须更改用户AuthKey
- Yii2,使用AuthKey
来验证用户自动登录。默认情况下,每个用户在用户表中只有一个AuthKey
,这样当您更改AuthKey
时,用户可以随时注销。所以我们必须定制。为每个用户会话创建一个AuthKey
,存储在用户表之外的某个地方。很容易做到:扩展yii'web'User类覆盖afterLogin
函数,为每个登录会话创建AuthKey
。重写validateAuthKey
函数来验证自动登录使用我们自定义的AuthKey
。现在,当您想要终止任何用户会话时:kill PHP会话id和AuthKey
,该会话将立即注销。我一直在我的项目中使用这个解决方案,它工作得很好。
根据Ngo的回答,我想出了一个很好的方法,更容易设置。
1)添加"lastrongession_id"字段到你的用户表
2)在主控制器中添加以下内容:
public function afterAction($action, $result)
{
$result = parent::afterAction($action, $result);
if(Yii::$app->user->id)
{
//update the user table with last_session_id
$user = User::find()->where(['id' => Yii::$app->user->id])->one();
$user->last_session_id = Yii::$app->session->id;
$user->save(false);
}
return $result;
}
3)将站点/登录操作更改为:
public function actionLogin()
{
if (!'Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
//delete previous session ID and change auth key
Yii::$app->session->destroySession(Yii::$app->user->identity->last_session_id);
$u = 'common'models'User::find()->where(['id' => Yii::$app->user->id])->one();
$u->auth_key = Yii::$app->security->generateRandomString();
$u->save(false);
return $this->goBack();
} else {
return $this->render('/site/login', [
'model' => $model,
]);
}
}