Yii2 - 如何在用户身份中设置动态 authTimeout?

问题描述 投票:0回答:2

在这里,我扩展了 Yii2 的

User
Identity。

这是我的配置。

'user' => [
            'identityClass' => app\models\UserMaster::class,
            'enableAutoLogin' => false,
            'loginUrl' => ['/auth/login'],
            'authTimeout' => 86400
        ],

在这里,我静态定义了

authTimout
。但是,我想做的是我想从数据库中获取超时值并将其设置在
authTimeout
.

谢谢。

php yii yii2 yii2-advanced-app yii2-basic-app
2个回答
4
投票

您可以在处理请求之前使用事件设置

authTimeout

'as beforeRequest' => [
    'class' => function (Event $event) {
        /* @var $app \yii\web\Application */
        $app = $event->sender;
        $app->getUser()->authTimeout = (new Query())
            ->select('value')
            ->from('{{%settings}}')
            ->where('name = :name', ['name' => 'authTimeout'])
            ->scalar($app->getDb());
    }
],

但可能更明确的方法是创建自定义组件并在

init()
中处理它。

class WebUser extends \yii\web\User {

    public function init() {
        parent::init();

        $this->authTimeout = (new Query())
            ->select('value')
            ->from('{{%settings}}')
            ->where('name = :name', ['name' => 'authTimeout'])
            ->scalar();
    }
}

然后在您的配置中使用新组件:

'components' => [
    'user' => [
        'class' => WebUser::class,
        'identityClass' => app\models\UserMaster::class,
        'enableAutoLogin' => false,
        'loginUrl' => ['/auth/login'],
    ],
    // ...
],

0
投票

可能不是最好的方法,但是如果你使用 cookie 的身份验证并且有 'enableAutoLogin'=>true 然后转到 vendor/yiisoft/yii2/web/User.php 并在这个方法的最后转到名为 switchIdentity 的方法您应该查看修改持续时间。对我来说它有效!!!!

    if ($this->enableAutoLogin && $duration > 0) 
{ 

//here change the value $duration example 900 sec(15 mins) 
$this->sendIdentityCookie($identity, $duration); 
}
© www.soinside.com 2019 - 2024. All rights reserved.