Автоматический выход из сеанса через x секунд для типа пользователя (Yii 1.x)

У меня есть приложение Yii 1.x, которое использует компонент WebUser для раздела входа на веб-сайт — в моем config/main.php у меня есть следующий блок в разделе моих компонентов, который автоматически отключит сеанс через 2 часа (например, 3600 x 2 или 7200 секунд).

Это прекрасно работает в том смысле, что пользователь «выгоняется» из моего приложения через заданное количество секунд, но как мне изменить это, чтобы этот выход из системы определенных «типов» пользователей с разным сроком действия.

например, если тип пользователя == 1, то выйдите из системы через 3600 секунд, если тип пользователя == 2, затем выйдите из системы через 7200 секунд...

// config/main.php
'components'        => array(
   'user'    => array(
       'class'   => 'application.components.WebUser',
       'allowAutoLogin' => true,
       'loginUrl'           => array('frontend/user/login'),
       'loginRequiredAjaxResponse' => 'CR_SESSION_EXPIRED',
       'authTimeout'       => 3600*2, // auto-logout after 2 hours
        ),
 .......

Примечание. Здесь используется Yii 1.x, а не Yii 2.0.

Я предполагаю, что это должно быть в рамках интеграции WebUser, а не в файле конфигурации.

-- обновление -- я добавил следующий блок в компонент WebUser.php (расширяющий CWebUser)

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

    if (($user = $this->getState('userModel')) !== null) {

        $this->authTimeout = 5;
        $this->absoluteAuthTimeout = 5;
        $this->setUserData(unserialize($user));
    }
}

Я установил authTimeout и absoluteAuthTimout на 5 секунд, но я все еще остаюсь в системе через 5 секунд ... есть идеи?


person Zabs    schedule 23.04.2015    source источник
comment
Разве вы не можете просто установить свойство $authTimeout, перезаписав функцию init() вашего класса WebUser? Вы можете основывать это на значениях, хранящихся в вашей конфигурации. В вашем файле конфигурации не должно быть никакой логики, только значения.   -  person Jelle de Fries    schedule 23.04.2015
comment
Вы должны вызвать parent::init(); после вашей логики. Теперь он сначала устанавливает сеанс, а затем устанавливает новый $authTimeout.   -  person Jelle de Fries    schedule 23.04.2015
comment
Думаю, я подозревал это!! Спасибо - предыдущий разработчик внес ряд изменений в WebUser, что он делал что-то совершенно отличное от исходного CWebUser.. например, он никогда не вызывал updateAuthStatus для одного...   -  person Zabs    schedule 23.04.2015
comment
@JelledeFries Потрясающе ... теперь все это имеет смысл :-) это был один из тех дней! Спасибо за ваши усилия .. это очень ценится!   -  person Zabs    schedule 23.04.2015


Ответы (1)


Как я сказал в своем комментарии.

Я думаю, вы должны иметь возможность перезаписать значение в своем классе WebUser.

<?php
class WebUser extends CWebUser{

    public $authTimeouts = array(); //array with the timeouts

    public function init(){
        //you need to get the userType first
        if(array_key_exists($userType,$this->authTimeouts)){ 
            $authTimeout = $this->authTimeouts[$userType];
        }
        parent::init();
    }
}

Тогда ваш конфиг должен выглядеть так:

// config/main.php
'components'        => array(
   'user'    => array(
       'class'   => 'application.components.WebUser',
       'allowAutoLogin' => true,
       'loginUrl'           => array('frontend/user/login'),
       'loginRequiredAjaxResponse' => 'CR_SESSION_EXPIRED',
       'authTimeout'       => 3600*2, // auto-logout after 2 hours
       'authTimeouts'=> array(
            'userType1' => 10,
            'userType2' => 500,
            ),
        ),
 ......

Что-то такое. Для получения дополнительной информации об исходном коде и функции init() см.: https://github.com/yiisoft/yii/blob/1.1.16/framework/web/auth/CWebUser.php#L196

person Jelle de Fries    schedule 23.04.2015
comment
я перезаписал эти значения безрезультатно... я делаю что-то не так в файле конфигурации? - person Zabs; 23.04.2015