Время сессии не истекает

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
bohdantheone
Сообщения: 135
Зарегистрирован: 2012.08.19, 14:31

Время сессии не истекает

Сообщение bohdantheone » 2012.10.13, 01:30

В конфиге пробовал разные варианты, вот так не помогает:

Код: Выделить всё

'session' => array(               
            'timeout' => 60,
        ),
Сессия не истекает, почему так? Можно хоть завтра прийти, все равно будешь залогинен. При

Изображение
Последний раз редактировалось bohdantheone 2012.10.13, 16:54, всего редактировалось 2 раза.

bohdantheone
Сообщения: 135
Зарегистрирован: 2012.08.19, 14:31

Re: Время сессии не истекает

Сообщение bohdantheone » 2012.10.13, 16:20

Скажите, как вы настраиваете таймаут сессий?

bohdantheone
Сообщения: 135
Зарегистрирован: 2012.08.19, 14:31

Re: Время сессии не истекает

Сообщение bohdantheone » 2012.10.13, 17:25

Проверил во всех популярных браузерах, везде время жизни не истекает никогда. Только после закрытия браузера.

maxsupermaxyii
Сообщения: 21
Зарегистрирован: 2012.07.04, 08:44

Re: Время сессии не истекает

Сообщение maxsupermaxyii » 2012.11.03, 17:13

Поддерживаю данную проблему, так же реализовал авторизацию, как не настраиваю, логин абсолютно не убиваем :-( Прочитал уже много форумов, не могу понять в чем проблема.

maxsupermaxyii
Сообщения: 21
Зарегистрирован: 2012.07.04, 08:44

Re: Время сессии не истекает

Сообщение maxsupermaxyii » 2012.11.03, 17:30

Опишу подробнее проблему. После авторизации пользователя не убивается сессия. В Yii прочел что по дефолту время сессии 1440 сек. ( 24мин. ) http://www.yiiframework.com/doc/api/1.1/CHttpSession. В конфиге main.php ничего не изменял, всё по дефолту после генерации проекта. Авторизацию реализовал как в демо блоге. Сессия не пропадает совсем, даже после закрытия бразуера, даже после суток, двух.

Этот код из метода login() в моделе LoginForm (которая так же генерируется по дефолту)

Код: Выделить всё

$duration = $this->rememberMe ? 3600 * 24 * 7 : 0; // 7 days
Yii::app()->user->login( $this->_identity, $duration );
 
Даже если вместо $duration передать 10 сек. закрыть вкладку или бразуер и снова обратится к странице, авторизация остается действительной :-( что очень странно!

Хотел еще бы заметить, что, при втором параметре $duration, cookie создается с правильным expire time который я задал, после истечения времени кука удаляется, но пользователь остается быть залогининым :-(

LoginForm.php

Код: Выделить всё

class LoginForm extends CFormModel
{
    public $email;
    public $password;
    public $rememberMe;
    public $verifyCode;

    private $_identity;

    public function actions()
    {
        return array(
            'captcha' => array(
                'class'       => 'CCaptchaAction',
                'transparent' => true,
            ),
        );
    }

    /**
     * Declares the validation rules.
     * The rules state that username and password are required,
     * and password needs to be authenticated.
     */
    public function rules()
    {
        return array(
            // username and password are required
            array( 'email, password', 'required' ),
            // rememberMe needs to be a boolean
            array( 'rememberMe', 'boolean' ),
            // password needs to be authenticated
            array( 'password', 'authenticate' ),
            array( 'verifyCode', 'captcha' ),
        );
    }

    /**
     * Declares attribute labels.
     */
    public function attributeLabels()
    {
        return array(
            'rememberMe' => 'Remember me next time',
            'verifyCode' => Yii::t( 'site', 'Verify code' ),
        );
    }

    /**
     * Authenticates the password.
     * This is the 'authenticate' validator as declared in rules().
     */
    public function authenticate( $attribute, $params )
    {
        if ( !$this->hasErrors() ) {
            $this->_identity = new UserIdentity( $this->email, $this->password );
            if ( !$this->_identity->authenticate() ) {
                $this->addError( 'password', 'Incorrect username or password' );
                $this->addError( 'email', ' ' );
            }
        }
    }

    /**
     * Logs in the user using the given username and password in the model.
     * @return boolean whether login is successful
     */
    public function login()
    {
        if ( $this->_identity === null ) {
            $this->_identity = new UserIdentity( $this->email, $this->password );
            $this->_identity->authenticate();
        }
        if ( $this->_identity->errorCode === UserIdentity::ERROR_NONE ) {
            $duration = $this->rememberMe ? 3600 * 24 * 7 : 0; // 7 days
            Yii::app()->user->login( $this->_identity, $duration );
            return true;
        } else {
            return false;
        }
    }
}
 
UserIdentity.php

Код: Выделить всё

class UserIdentity extends CUserIdentity
{
    public $_id;

    public function authenticate()
    {
        $user = User::model()->find( 'LOWER(email)=?', array( $this->username ) );
        if ( $user === null ) {
            $this->errorCode = self::ERROR_USERNAME_INVALID;
        } else if ( !$user->validatePassword( $this->password ) ) {
            $this->errorCode = self::ERROR_PASSWORD_INVALID;
        } else {
            $this->_id      = $user->userid;
            $this->username = $user->email;
            ( $user->isAdmin ? $this->setState( 'isAdmin', true ) : $this->setState( 'isAdmin', false ) );
            $this->errorCode = self::ERROR_NONE;
        }
        return !$this->errorCode;
    }

    public function getId()
    {
        return $this->_id;
    }
}
 
main.php

Код: Выделить всё

return array(
    'sourceLanguage' => 'en',
    'language'       => 'en',
    'basePath'       => dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..',
    'name'           => 'My Web Application',

    // preloading 'log' component
    'preload'        => array( 'log' ),

    // autoloading model and component classes
    'import'         => array(
        'application.models.*',
        'application.components.*',
        'ext.shoppingCart.*',
    ),
    'aliases'        => array(
        //assuming you extracted the files to the extensions folder
        'xupload' => 'ext.xupload'
    ),

    'modules'        => array(
        // uncomment the following to enable the Gii tool
        'gii' => array(
            'class'          => 'system.gii.GiiModule',
            'password'       => 'vp3whbjvp8',
            // If removed, Gii defaults to localhost only. Edit carefully to taste.
            'ipFilters'      => array( '127.0.0.1', '::1' ),
            'generatorPaths' => array(
                'application.gii' //nested set Model and Crud templates
            ),
        ),
        'admin',
        'pm'  => array(
            'userClass'           => 'User', //Класс, представляющий модель пользователя
            'getNameMethod'       => 'getName', // имя метода для модели пользователя, возвращающего имя пользователя.
            'getUserIdExpression' => 'Yii::app()->user->id', // выражение, возвращающее id текущего пользователя в приложении.
            'tableName'           => 'pm', // имя таблицы с персональными сообщениями
            'reallyDelete'        => true, // удалять сообщения из базы
            'outgoingPageSize'    => 10, // отправленных сообщений на страницу
            'incomingPageSize'    => 10, // принятых сообщений на страницу
            'conversationMode'    => false, // использовать беседы при переписке
            'defaultController'   => 'message', // назначаем базовый контроллер
        )
    ),

    // application components
    'components'     => array(
        'email'        => array(
            'class'    => 'application.extensions.email.Email',
            'delivery' => 'php', //Will use the php mailing function.
            //May also be set to 'debug' to instead dump the contents of the email into the view
        ),
        'user'         => array(
            'loginUrl'       => array( 'user/login' ),
            // enable cookie-based authentication
            'allowAutoLogin' => true,
        ),
        'shoppingCart' => array(
            'class' => 'ext.shoppingCart.EShoppingCart',
        ),
        'simpleImage'  => array(
            'class' => 'ext.resizeImage.CSimpleImage'
        ),
        // uncomment the following to enable URLs in path-format
        'urlManager'   => array(
            'class'          => 'application.extensions.urlManager.LangUrlManager',
            'languages'      => array( 'en', 'it', 'fr', 'es', 'de', 'ru' ),
            'langParam'      => 'lang',
            'urlFormat'      => 'path',
            //'urlSuffix'     => '.html',
            'showScriptName' => false,
            'rules'          => array(
                /* Specific rules */
                '<lang:[a-z]{2}>/<alias:(about)>'      => 'site/pages',
                '<lang:[a-z]{2}>/contact'              => 'site/contact',
                '<lang:[a-z]{2}>/info'                 => 'site/info',
                '<lang:[a-z]{2}>/catalog/*'            => 'category/index',
                '<lang:[a-z]{2}>/product/<id:\d+>/*'   => 'products/view',

                /* Index page */
                '<lang:[a-z]{2}>'                      => 'site/index',

                /* Basic rules */
                '<lang:[a-z]{2}>/<_c>'                 => '<_c>',
                '<lang:[a-z]{2}>/<_c>/<_a>/<id:\d+>/*' => '<_c>/<_a>',
                '<lang:[a-z]{2}>/<_m>/<_c>'            => '<_m>/<_c>',
                '<lang:[a-z]{2}>/<_m>/<_c>/<_a>/*'     => '<_m>/<_c>/<_a>',
                '<lang:[a-z]{2}>/<_m>/<_a>'            => '<_m>/<_a>',
            ),
        ),
        /*'db'          => array(
            'connectionString' => 'sqlite:' . dirname( __FILE__ ) . '/../data/testdrive.db',
        ),*/
        // uncomment the following to use a MySQL database
        'db'           => array(
            'connectionString'   => 'mysql:host=localhost;dbname=farmasite',
            'emulatePrepare'     => true,
            'username'           => 'root',
            'password'           => '',
            'charset'            => 'utf8',
            // включаем профайлер
            'enableProfiling'    => true,
            // показываем значения параметров
            'enableParamLogging' => true,
        ),
        'errorHandler' => array(
            // use 'site/error' action to display errors
            'errorAction' => 'site/error',
        ),
        'log'          => array(
            'class'  => 'CLogRouter',
            'routes' => array(
                array(
                    // направляем результаты профайлинга в ProfileLogRoute (отображается
                    // внизу страницы)
                    'class'   => 'CProfileLogRoute',
                    'levels'  => 'profile',
                    'enabled' => true,
                ),
                // uncomment the following to show log messages on web pages
                /*
                    array(
                        'class'=>'CWebLogRoute',
                    ),
                    */
            ),
        ),
    ),

    // application-level parameters that can be accessed
    // using Yii::app()->params['paramName']
    'params'         => array(
        // this is used in contact page
        'adminEmail' => 'boiler0303@gmail.com',
    ),
);
 
Возможно я допустил ошибку, возможно еще что-то, но я уже сутки ищу выход из ситуации :-( не могу понять где проблема...

Аватара пользователя
samdark
Администратор
Сообщения: 8554
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Время сессии не истекает

Сообщение samdark » 2012.11.03, 19:32

И на основе чего он логинится, если куки нет и браузер переоткрыли? У вас случаем кеша постраничного нет?

maxsupermaxyii
Сообщения: 21
Зарегистрирован: 2012.07.04, 08:44

Re: Время сессии не истекает

Сообщение maxsupermaxyii » 2012.11.03, 20:16

Sam Dark писал(а):И на основе чего он логинится, если куки нет и браузер переоткрыли? У вас случаем кеша постраничного нет?
Нет, кеширования страниц нет, все в принципе по дефолту.

Вот скрин всех cookie которые образуются после логина

Изображение

ясное дело когда удаляю PHPSESSID, после обновления страницы происходит разлогин.

Аватара пользователя
samdark
Администратор
Сообщения: 8554
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Время сессии не истекает

Сообщение samdark » 2012.11.03, 20:27

Expires = Session на скрине. То есть обязано удалиться по закрытию браузера. Если этого не происходит, виноват браузер.

maxsupermaxyii
Сообщения: 21
Зарегистрирован: 2012.07.04, 08:44

Re: Время сессии не истекает

Сообщение maxsupermaxyii » 2012.11.03, 20:47

Sam Dark писал(а):Expires = Session на скрине. То есть обязано удалиться по закрытию браузера. Если этого не происходит, виноват браузер.
Да, действительно, проблема в Google Chrome, в FireFox после закрытия браузера всё хорошо... Я так понимаю нужно реализовать свой механизм авторизации ? или может есть другие способы решения проблемы с помощью yii ?

maxsupermaxyii
Сообщения: 21
Зарегистрирован: 2012.07.04, 08:44

Re: Время сессии не истекает

Сообщение maxsupermaxyii » 2012.11.03, 21:43

установив в конфиге authTimeout property класса CWebUser, происходит разлогин по установленному времени, но как я и думал не будет работать чекбокс "remember me next time":

Код: Выделить всё

$duration = $this->rememberMe ? 3600 * 24 * 7 : 0; // 7 days
Yii::app()->user->login( $this->_identity, $duration );
кука устанавливается на 7 дней, всё правильно, но, после 10 секунд бездействия, которые я установил, происходит логаут :-( Скорей всего что я не понимаю что, за что отвечает, можете разъяснить этот механизм ? Читаю manual, а так же API и не могу понять что делаю не так... запутался :-(

maxsupermaxyii
Сообщения: 21
Зарегистрирован: 2012.07.04, 08:44

Re: Время сессии не истекает

Сообщение maxsupermaxyii » 2012.11.03, 22:50

Со всем разобрался, Sam Dark - спасибо большое за ответы. Виновник к сожалению Google Chrome http://stackoverflow.com/questions/1061 ... on-cookies.

Аватара пользователя
samdark
Администратор
Сообщения: 8554
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Время сессии не истекает

Сообщение samdark » 2012.11.04, 01:09

Вот оно что. В последних версиях это по умолчанию. При желании можно отключить через chrome://chrome/settings/, «Продолжать работу приложений в фоновом режиме после закрытия Google Chrome».

Ответить