Уничтожить сессию, но сохранить flashdata - PullRequest
4 голосов
/ 17 марта 2011

Я использую Tank Auth для управления пользователями в моем приложении CI 1.7.3.Все работает нормально, но я пытаюсь настроить отображение flash_message, когда пользователь выходит из системы.Проблема в том, что функция $this->tank_auth->logout(); уничтожает сеанс.Я изменил функцию выхода из системы в библиотеке Tank Auth, чтобы она выглядела так:

    function logout()   {
        $this->delete_autologin();

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

Ранее

function 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();
        }

В моем контроллере у меня есть

function logout(){
    if ($this->tank_auth->is_logged_in()) { // logged in
        $this->session->set_flashdata('status_message', $this->lang->line('auth_message_logged_out'));
        $this->tank_auth->logout();

        redirect('');           

    } 

}

Если я уберу функцию $this->tank_auth->logout();, сообщение будет отображаться нормально.Я уверен, что это простая проблема сессии

Ответы [ 3 ]

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

Если вы попытаетесь установить флэш-данные при использовании базы данных в том же запросе после вызова sess_destroy(), он не будет работать (потому что нет сеанса для добавления флэш-данных).эту проблему, добавьте $this->ci->session->sess_create(); после вызова sess_destroy().Это работает, потому что вы заново создаете сеанс, прежде чем пытаться добавить к нему данные.Это единственный способ использовать флэш-данные после sess_destroy(), если вы используете сеансы в базе данных.

2 голосов
/ 31 декабря 2011

Функция sess_destroy() уничтожает также переменные флеш-сессии, используемые для передачи сообщения.

U уже ответил на ваш вопрос, в библиотечной функции logout() вам необходимо заменить

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

с

$this->ci->session->unset_userdata(array('user_id' => '', 'username' => '', 'status' => ''));

Это не приведет к полному уничтожению сеанса, только пользовательские данные, используемые для входа в систему, поэтому я рекомендую вместо этого изменить функцию logout() в контроллере и показать сообщение вручную,передав его в представление.

1 голос
/ 17 марта 2011

Хотя это обходной путь, он может помочь вам ...

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

<? if ($this->session->flashdata('status_messege'): ?>

    <p><?= $this->session->flashdata('status_message') ?></p>

<? endif; ?>

вы МОЖЕТЕ добавить к этому еще elseif и проверить, что реферер является вашей функцией выхода из системы ...

<? if ($this->session->flashdata('status_messege'): ?>

    <p><?= $this->session->flashdata('status_message') ?></p>

<? else if ($this->agent->referrer() == site_url('path/to/logout'): ?>

    <p><?= $this->lang->line('auth_message_logged_out') ?></p>

<? endif; ?>

Немного хакерский способ преодолеть эту проблему, но, тем не менее, возможно.

...