Php Yii2从用户当前会话远程注销用户会话

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($

我想从同一用户的当前会话注销在不同浏览器/环境中登录的用户会话。与此类似的功能-

Yii2是使用的后端框架。使用redis进行会话管理-yii2-redis。我还保存了保存在数据库中的会话ID

我跟随这篇文章——

但是没有任何成功

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 override
afterLogin
函数,为每个登录会话创建
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