IonAuth - кажется, случайным образом выводит меня из системы

Я использую ionAuth, и мне кажется, что он почти случайным образом выводит меня из системы? Я использую Codeigniter v2.1.4 - он отлично регистрируется, однако ionAuth, кажется, выходит из системы через случайные промежутки времени, есть ли способ заставить сеанс оставаться активным, пока я не вызову функцию ionAuth-> logout?

Моя конфигурация CI выглядит следующим образом:

$config['sess_cookie_name']     = 'cisession';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 600;

Мой файл конфигурации ion_auth выглядит следующим образом:

 $config['user_expire'] = 0;
 $config['user_extend_on_login'] = FALSE;

Может ли кто-нибудь дать мне какие-либо указания на то, что может быть причиной проблемы (проблем)?


person Zabs    schedule 04.10.2013    source источник
comment
вы где-нибудь делаете какие-либо запросы ajax? есть проблемы с классом сеанса CI и условиями гонки, которые еще не были полностью решены   -  person jmadsen    schedule 06.10.2013
comment
Я использую запросы ajax - на домашней странице есть запрос ajax, который в основном выполняет запрос GET для поиска в таблице базы данных.   -  person Zabs    schedule 08.10.2013


Ответы (1)


Причиной проблемы является ротация файлов cookie сеанса при выполнении вызова AJAX, правильное исправление было включено в CodeIgniter 3.

У вас есть четыре варианта:

Решение: я сам сталкивался с этой проблемой раньше, не зная точно ее причины. Короче говоря, я сохранил обещание каждого XMLHttpRequest, если встречался код состояния HTTP 401, клиентское приложение запрашивало учетные данные в форме всплывающего окна, а затем повторяло обещание AJAX.

Клиентская сторона с jQuery, просто добавьте этот обработчик ajaxError:

$(document).ajaxError(function (e, xhr, settings, exception) {
    if (xhr.status == 401)
    {
        // open your popup
        $('#login-popup').modal('open');

        // attach the xhr object to the listener
        $(document).bind( "retry-xhr", {
                xhro: xhr
            },
            function( event ) {
            // retry the xhr when fired
            $.ajax( event.data.xhro );
        });
    }
});

и когда вы снова войдете в систему, просто вызовите это, чтобы повторить свой запрос:

$(document).trigger('retry-xhr');

На стороне сервера вам нужно только добавить if в свой конструктор

if (!$this->session->userdata('logged_in') && $this->input->is_ajax_request())
        {
            $this->output->set_status_header('401');
            exit;
        }

Это было полезно, потому что некоторые пользователи оставляли окно своего веб-приложения открытым на ночь, и срабатывал тайм-аут сеанса. Затем пользователи звонили мне и сообщали, что не могут выполнять какие-либо функции AJAX, и мне приходилось говорить им, чтобы они нажали F5.

пс. если на Angular, я успешно использовал модуль HTTP Auth Interceptor

Хак: см. этот пост, его решение состоит в том, чтобы создать еще одно поле в таблице ci_session и проверить наличие обоих файлов cookie, чтобы ваш сеанс оставался действительным после ротации.

Он также подробно объясняет, что вызывает этот сбой

http://www.hiretheworld.com/blog/tech-blog/codeigniter-session-race-conditions

Обновление: начните использовать следующую версию, в которой уже исправлено:

https://github.com/EllisLab/CodeIgniter/tree/release/3.0

Исправить Заменить строку 346 в system/libraries/Session.php (функция sess_update())

if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)

С:

if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now || $this->CI->input->is_ajax_request())
person Josue Alexander Ibarra    schedule 08.10.2013
comment
Я попробую - есть ли хорошее руководство по обновлению codeigniter с версии 2.1.4 до версии 3? Нужно ли мне делать много обходных путей для моего приложения v2, чтобы сделать его совместимым с v3? - person Zabs; 09.10.2013
comment
Это зависит от того, что делает ваше приложение, самое большое изменение, на мой взгляд, заключается в том, что некоторые функции теперь возвращают null вместо false. Если логика вашего приложения зависит от этого, вы отлично проведете время, пытаясь найти эти имена функций. Я считаю, что это самое краткое руководство по обновлению: Обновление до CI 3.00 - person Josue Alexander Ibarra; 09.10.2013
comment
спасибо за это - я собираюсь попробовать это в ближайшее время, но в любом случае дам вам награду за количество полезной информации, которую вы предоставили - еще раз спасибо :) - person Zabs; 14.10.2013
comment
awesome =] обязательно попробуйте первый вариант, если ваше бизнес-приложение будет работать изо дня в день (где время ожидания сеанса может стать проблемой) - person Josue Alexander Ibarra; 14.10.2013
comment
Привет, Джосу. Не могли бы вы объяснить, где именно мне нужно добавить этот код в мое приложение CI? Я просто немного не уверен, и вы, кажется, знаете счет с проблемой :) спасибо! :) - person Zabs; 18.10.2013
comment
Хорошо, дайте мне немного времени, и я сделаю работающий пример с заголовками 401. С другой стороны, патч находится в вашей системе/библиотеках/Session.php вашего приложения CI. Что он делает, он добавляет проверку, чтобы увидеть, является ли это XMLHttpRequest, если это так, он выходит из функции ротации сеанса. - person Josue Alexander Ibarra; 18.10.2013