Как реализовать механизм бана и удалить сессию пользователя?
Возникла необходимость реализовать для админов возможность бана пользователя на сайте.
Сам бан реализовал, но необходимо чтоб, если существует сессия (юзер онлайн) - она была очищена или удалена сразу после нажатия кнопки "в бан", высветилось соответствующее сообщение.
Первое что приходит в голову, используя таблицу sessions от codeigniter - добавить в нее поле user_id и допустим Ajax-ом проверять статус поля, если user_id существует, значит сессия жива, если нет session->destroy().
Прикинул, если так вот будут проверять 10к пользователей, например, выйдет достаточно накладно.
Есть ли какие-то другие способы реализовать обрыв чужой сессии без постоянного обращения в БД?
FanatPHP, Вопрос в том что если сессию убить, то страница все еще будет открыта в браузере. Только при перезагрузке это обнаружится что сессии нет. Человек хочет что бы при бане, страница перегружалась.
FanatPHP, Ну если сесси нет то приложение попытается открыть новую сессию. При открытии сессии попробует авторизовать пользователя и узнает что он заблочен.
Или ты предлагаешь чтобы юзер сначала залогинился, и ему написало что он забанен? Ну это вариант, но это как-бы противоречит тому что хочет аффтар, чтобы прям сразу писало
FanatPHP, запись сессии CI не дает удалить из БД, поэтому таким способом не получиться решить вопрос.
Только проверкой есть ли данные юзера в сессии, если юзер в сессии есть и ид-юзера = ид-юзера в БД -> смотрим в колонку is_ban, если 1 значит сносим сессию методом destroy();
А при логине, сразу лезем в таблицу юзерс и смотрим активна ли учетка?
Ну я так понимаю бан, это в какой нибудь таблице users поле isBan = true?
Ну так сделайте чтобы у пользователя при загрузке любой страницы проверялось это поле, и если оно true, то чистим сессию, редиректим куда нужно....
P.S. Если невтерпеж, то яксом пуляем каждые 10 секунд и если забанен, то чистим сессию и выдаем красивое всплывающее окно
Не совсем понятна архитектура приложения. Вроде РНР а предполагается Аякс.
Если в вас РНР, то нужно просто при перезагрузке страницу каждый раз проверять пользователя. Или вы хотите что бы уже открытая страница закрылась? На сколько это важно в РНР. Пусть смотрит, следующая перезагрузка и все, больше доступа нет. При перезагрузке сообщение и показать что доступа нет.
Zenko, Ну тогда аякс. Но это дорого. Такая операция, ради пары пользователей все 10 000 пользователей будут слать к базе запрос раз в несколько секунд. Зачем? Что случится если забаненый пользователь останется на странице до перезагрузки? Если страница статичная, то ни чего он не получит а если динамическая, добавить проверку можно в динамике.
решил сделать 2 поля в таблице sessions
user_id, is_ban
Проиндексировать можно по полю user_id, отлавливать по is_ban. Работать должно быстрее, чем по таблице users т.к. юзеров на сайте < зарег. юзеров.
Насчет моментального разрыва сессии - решил отказаться.