Грязная уловка, которая может вам помочь.
Вы можете найти сеансы, принадлежащие определенному электронному письму, выполнив что-то подобное в таблице сеансов
select id, ip_address, cast(data as char(1000)) datablob
from internal.ci_sessions
having datablob like '%email@domain.com%';
Вы можете встретить несколько записей, относящихся к предыдущим сеансам, вдоль текущего активного.
как только вы их нашли, просто удалите эти строки, и сеанс будет эффективно завершен, и пользователь будет вынужден повторно войти в систему
Имейте в виду: это не то, что вы должны делать часто. Использование таблицы сессий может привести к нежелательным последствиям, если вы коснетесь чего-то, чего не должны делать. Кроме того, если ваша таблица сеансов стала большой после многих месяцев / лет использования без периодического обслуживания, удаление одной или нескольких строк может вызвать временное снижение производительности, если таблица нуждается в повторной индексации. Не говори, что я тебя не предупреждал :)
Если это не то, что вам нужно сделать в экстренной ситуации, и вы можете потратить время на то, чтобы закодировать это, я предлагаю то, что я обычно делаю (да, необъективное предложение, я знаю :))
1.- добавить поле «принудительного выхода» из таблицы с информацией о пользователе.
По умолчанию это поле имеет значение "N" или что-то подобное.
На каждом просмотре страницы (я делаю это на конструкции контроллера), запрашивайте таблицу пользователя для флага. Если возвращается «N», переходите к тому, к чему идет пользователь.
2.- выйти из системы, если есть флаг выхода
Если флаг возвращается как «Y», уничтожить сеанс пользователя и перенаправить пользователя на страницу входа. После этого (вы также можете сделать это после успешного входа в систему) не забудьте сбросить флаг на N, чтобы пользователь не мог войти в цикл выхода из системы.
Это добавляет один запрос к каждому просмотру страницы, но влияние должно быть незначительным