Уничтожение определенного сеанса в 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
- идентификатор пользователя.
Итак, есть способ как-то выбрать строку в таблице сеанса на основе идентификатора пользователя, а затем удалить строку и уничтожить сеанс. Или есть еще один способ сделать это полностью?
Ответы
Ответ 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, это можно сделать быстро и эффективно.