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


Yii2 remote logout a user session from the user current session

我想注销在不同浏览器/环境中登录的用户会话,而不是同一用户的当前会话。类似于此的功能- https://www.facebook.com/settings?tab=security&section=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,
        ]);
    }
}