flashdata не сохраняется между перенаправлениями при использовании Tank Auth - PullRequest
3 голосов
/ 30 сентября 2011

Я использую последнюю версию Codeigniter и tank_auth 1.0.9 на сайте, который я создаю.

При использовании set_flashdata () и flashdata () соответственно, ничего не возвращается при перенаправлении, но если я установлю sess_use_database в FALSE в конфигурации, это будет работать.

Я искал вокруг и не мог найти ответ - Кто-нибудь еще сталкивался с этой проблемой и исправил ее?

Ответы [ 4 ]

2 голосов
/ 24 июля 2012

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

Tank Auth запускает этот код из основной библиотеки ($this->tank_auth->logout()):

$this->delete_autologin();

// See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line
$this->ci->session->set_userdata(array('user_id' => '', 'username' => '', 'status' => ''));

$this->ci->session->sess_destroy();

Затем он запускает этот код из контроллера аутентификации ($this->_show_message()):

$this->session->set_flashdata('message', $message);
redirect('/auth/');

Проблема в том, что, поскольку sess_destroy() был запущен до установки flashdata, нет строки базы данных для добавления flashdata, поэтому flashdata никогда не устанавливается.

На данный момент есть несколько решений:

Вариант 1:

Добавить $this->ci->session->sess_create(); сразу после $this->ci->session->sess_destroy(); в функции logout() в application/libraries/Tank_auth.php

Это работает, потому что вы создаете новый пустой сеанс, где могут храниться флэш-данные. Потенциальным минусом для этого является то, что вы выполняете больше операций с базой данных (удаление + вставка).

Вариант 2:

Комментарий / удаление $this->ci->session->sess_destroy(); в функции logout() в application/libraries/Tank_auth.php

Это работает, потому что сеанс не разрушен, что позволяет CI выполнять только запрос на обновление для добавления flashdata. Это, вероятно, лучше, чем вариант 1, если вам абсолютно не нужно уничтожать сеанс.

Вариант 3:

Установите $config['sess_use_database'] на FALSE.

Это работает, потому что сеанс автоматически создается при повторном запросе, а не как он работает при сохранении сеансов в базе данных. Потенциально менее безопасный.

В конце концов, вам решать, какой вариант лучше всего подходит для вашего приложения.

0 голосов
/ 04 октября 2013

Для меня лучше исправить проверку наличия сеанса перед установкой flashdata в show_message ().

function _show_message($message)
{
    // Patch for show_message() after logout(). Make sure the session exist before   set_flashdata().
    if(!$this->session->sess_read())
    {
        $this->session->sess_create();
    }
    $this->session->set_flashdata('message', $message);     
   redirect('/auth/');      
}
0 голосов
/ 16 августа 2012

Точно. Документация CodeIgniter указывает здесь: http://codeigniter.com/user_guide/libraries/sessions.html

=============================
Destroying a Session

To clear the current session:
$this->session->sess_destroy();

Note: This function should be the last one called,
    and **even flash variables will no longer be available**.
    If you only want some items destroyed and not all, use unset_userdata().
=============================

Я покопался в файле system / library / Session.php и при сохранении флэш-данных запускает метод sess_write(), который только ОБНОВЛЯЕТ базу данных, как вы сказали.

0 голосов
/ 16 декабря 2011

если tank_auth выполняет какие-либо внутренние перенаправления, вы можете потерять данные флэш-памяти в этом запросе на перенаправление.

...