Подтвердить что ты не робот

Уничтожение определенного сеанса в Code Igniter

Примечание для персонала: Этот вопрос и связанные с ним ответы заблокированы, чтобы предотвратить обсуждение темы вокруг текущее событие это связано с вопросом. Вопросы об этом событии можно найти на нашем мета-сайте. Спасибо!

Я хочу, чтобы иметь возможность регистрировать пользователей вне моего приложения, встроенного в Code Igniter.

Я знаю, как закончить активный локальный сеанс:

$this->session->sess_destroy();

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

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

a:4:
{s:9:"user_data";s:0:"";s:6:"userid";s:6:"189034";s:9:"logged_in";b:1;s:5:"token";i:1767727789;}

где 189034 - идентификатор пользователя.

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

4b9b3361

Ответ 1

Создайте новый столбец в таблице ci_session.

ALTER TABLE 'yourdatabase'.'ci_sessions' 
ADD COLUMN 'userid' VARCHAR(45) NULL  AFTER 'user_data' ;

Затем в функции входа в систему получите идентификатор из процесса входа в систему и перед добавлением информации о пользовательских данных в сеанс выполните:

/* Delete any existing sessions with the current userid session.
Note - a new session has already been generated but does not have a value
in the userid column, so won't get deleted. */
$this->db->delete('ci_sessions',array('userid' => $identity));    

// Get the current session and update it with the userid value.
$session_id = $this->session->userdata('session_id');
$this->db->where('session_id', $session_id);
$this->db->update('ci_sessions', array('userid' => $identity));

Где $identity - ваш идентификатор пользователя. Это очищает любые предыдущие сеансы и означает, что только один существует за один раз.

Ответ 2

Существует функция уничтожения некоторых элементов/сеансов, которые вы хотите

$this->session->unset_userdata('session_name')

И чтобы один пользователь мог регистрировать один компьютер за раз или один браузер за раз, вы можете прочитать здесь больше

Разрешить только один сеанс

Ответ 3

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

foreach ($this->db->get('sessions')->result() as $session)
{
    $data = unserialize($session->user_data);

    if ( ! isset($data['user_id'])) continue;

    if ($data['user_id'] === $id_to_delete)
    {
        // delete the row
            $this->db->where('session_id', $session->session_id)
                ->delete('sessions');
    }
}

Я бы, вероятно, отговорил это. Каждый пользователь вашего сайта, вошедший в систему или нет, имеет сеанс, который должен быть выбран, и помните: у одного пользователя может быть несколько сеансов, поэтому вам придется циклически перебирать все.

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