Изменения токена сеанса в codeigniter - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть веб-приложение, в котором я могу выйти из системы.При выходе из системы сеанс нарушен, т.е.удалено с помощью sess_destroy () в system> library> Session.php.

, но всякий раз, когда пользователь выходит из системы, токен, соответствующий пользователю, удаляется, но вместо этого новый токен создается в таблице сеанса без каких-либо пользовательских данных.

Ниже приведен поток, через который он проходит, когда я снова перенаправляю пользователя на страницу входа, поток выглядит следующим образом:

logout -> __construct () на странице входа -> __construct () в CI_Controller -> initialize() в Loader.php -> _ci_autoloader () в Loader.php -> $ autoload ['library'] в autoload.php -> __construct () в Session.php ->

if ( ! $this->sess_read()) {
        $this->sess_create();
      } else {
        $this->sess_update();
      } 

, затем вsess_read (),

        $session = $this->CI->input->cookie($this->sess_cookie_name);
        // No cookie?  Goodbye cruel world!...
        if ($session === FALSE)
        {
            log_message('debug', 'A session cookie was not found.');
            return FALSE;
        }

, следовательно, другой он идет в sess_create () и создает другой сеанс,

$this->userdata = array(
                            'session_id'    => md5(uniqid($sessid, TRUE)),
                            'ip_address'    => $this->CI->input->ip_address(),
                            'user_agent'    => substr($this->CI->input->user_agent(), 0, 120),
                            'last_activity' => $this->now,
                            'user_data'     => ''
                            );

, когда сеансы создаются, он назначается cookie, когдасеанс уничтожен, cookie удален.но как только новая страница загружается и вместе с ней загружается библиотека сеансов, она вставляет новую строку в таблицу сеансов.

, которая увеличивает размер базы данных, я был бы благодарен сообществу за предложение по этому вопросу.также кто-нибудь еще сталкивается с той же проблемой?

ps Я использую CI2 * ​​1020 *

сессия Destry,

function sess_destroy()
    {
        // Kill the session DB row
        if ($this->sess_use_database === TRUE && isset($this->userdata['session_id']))
        {
            $this->CI->db->where('session_id', $this->userdata['session_id']);
            $this->CI->db->delete($this->sess_table_name);
        }

        // Kill the cookie
        setcookie(
                    $this->sess_cookie_name,
                    addslashes(serialize(array())),
                    ($this->now - 31500000),
                    $this->cookie_path,
                    $this->cookie_domain,
                    0
                );

        // Kill session data
        $this->userdata = array();
    }

1 Ответ

0 голосов
/ 13 ноября 2018

Это не является неожиданностью в CI, поскольку сеансы создаются / обновляются всякий раз, когда посетитель получает доступ ко всему, что использует библиотеку сеансов. Тот факт, что эти сеансы являются «пустыми» (поскольку пользователь не вошел в систему), немного не имеет значения. Вы можете периодически очищать таблицу сеансов (удаляя все сеансы без данных), но количество места, которое вы будете восстанавливать, не так много.

Все выше сказанное, если вы хотите предотвратить поведение, которое вы испытываете, вместо того, чтобы разрушать сеанс, просто сбросьте его переменные, чтобы он стал пустым.

unset ($this->session->userdata);

Таким образом, у пользователя будет сохраняться тот же файл cookie сеанса, и единственное изменение состоит в том, что он потеряет данные, которые он содержит в базе данных, эффективно выйдя из системы.

РЕДАКТИРОВАТЬ: Я не особенно знаком с CI 2, так как весь мой код сейчас на CI3 и все, что у меня когда-то было на CI2, давно ушло. Но похоже, что вы проходите некоторые ненужные скачки с управлением сеансами, а не полностью полагаетесь на встроенную функциональность CI, которая может быть немного неоптимальной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...