У меня была такая же проблема, и я понял проблему. Если вы храните сессии в базе данных, это не будет работать.
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
.
Это работает, потому что сеанс автоматически создается при повторном запросе, а не как он работает при сохранении сеансов в базе данных. Потенциально менее безопасный.
В конце концов, вам решать, какой вариант лучше всего подходит для вашего приложения.