Php Yii2从用户当前会话远程注销用户会话
我想从同一用户的当前会话注销在不同浏览器/环境中登录的用户会话。与此类似的功能- Yii2是使用的后端框架。使用redis进行会话管理-yii2-redis。我还保存了保存在数据库中的会话ID 我跟随这篇文章—— 但是没有任何成功Php Yii2从用户当前会话远程注销用户会话,php,session,redis,yii2,logout,Php,Session,Redis,Yii2,Logout,我想从同一用户的当前会话注销在不同浏览器/环境中登录的用户会话。与此类似的功能- Yii2是使用的后端框架。使用redis进行会话管理-yii2-redis。我还保存了保存在数据库中的会话ID 我跟随这篇文章—— 但是没有任何成功 session_id($old_session_id); session_start(); // This line throws error. session_destroy(); 使用\Yii::$app->session->destroilsession($
session_id($old_session_id);
session_start(); // This line throws error.
session_destroy();
使用\Yii::$app->session->destroilsession($oldSessionId)
删除redis中的密钥时未注销
将会话id更改为旧id,然后销毁会话也不起作用
$currentSessionId = \Yii::$app->session->getId();
\Yii::$app->session->setId($oldSessionId);
\Yii::$app->getSession()->destroy();
\Yii::$app->session->setId($currentSessionId);
如果有人成功地实现了这一点,请分享您的解决方案。此外,如果有任何关于此的文档可以提供帮助,请务必提供。第一个,
session\u start()
必须在session\u id()
之前调用,并且只需调用一次
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
session_id($old_session_id);
session_destroy();
但仅仅删除会话是不够的,若你们允许用户自动登录,因为浏览器将使用cookies自动登录。要解决此问题,必须更改用户AuthKey
-Yii2使用AuthKey
验证用户自动登录。默认情况下,每个用户在用户表中只有一个AuthKey
,这样当您更改AuthKey
时,用户可以在任何位置注销。所以我们必须定制。为每个用户会话创建一个AuthKey
,存储在用户表以外的位置。操作简单:扩展yii\web\User class overrideafterLogin
函数,为每个登录会话创建AuthKey
。重写validateAuthKey
函数以使用我们的自定义AuthKey
验证自动登录。现在,当您想要终止任何用户会话时:终止PHP会话id和AuthKey
该会话将立即注销。
我一直在我的项目中使用此解决方案,效果很好。根据Ngo的回答,我找到了一种效果很好且易于设置的方法 1) 将“上次会话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,
]);
}
}
不为我工作。我已经设定为真。我使用用户名+密码登录,类似于。更改auth_密钥只会更新_标识cookie,而不会注销会话。你能分享一些你实现的示例代码吗。还有,您使用的登录类型。您必须同时终止AuthKey和PHP会话,就像您更改或删除
AuthKey
的方式一样。只需防止自动登录,终止PHP会话将立即终止用户会话。我既删除了auth_密钥,也销毁了会话。但远程用户会话未注销。请尝试禁用自动登录。删除会话后,您的用户是否注销?感谢@NgôVăn Thao和@Nate的回答。这就是我从他们的答案中获取信息的方法。将启用自动登录设置为false。创建一个会话
表(用户id、会话id)以及与设备、浏览器相关的其他属性。在afterLogin
方法中,将用户id和会话id添加到session
表中。要远程注销会话,请使用-Yii::$app->session->destroucsession(sessionId)销毁会话,并更改用户的身份验证密钥。注意:这对默认会话组件不起作用。在yii\redis\Session