Разлогиниваем посетителей сайта
28
Августа 2011 г.
Предисловие
Как известно, в 1С-Битрикс нет стандартного инструмента для разлогирования пользователя на сайте. И если завелся у вас троль на форуме – он так и будет гадить, пока у него не закончится сессия или он сам не выйдет.
Я уже не говорю о более сложных ситуациях, когда этот троль имеет права более широкие, чем просто зарегистрированный пользователь…
Мне всегда хотелось иметь кнопку «замочить» в списке пользователей. Но так просто прервать чужую сессию невозможно. Что же делать?
После деактивации пользователя стандартными средствами вам нужно будет ждать, когда пользователь либо сам разлогинится (выйдет из системы) либо у него закончится сессия. При изменении группы та же ситуация.
С этим же механизмом связан и другой процесс.
Скажем, поменяли вы пользователю группу – стал он вип-пользователем с правом доступа в вип-зону. Но пользователь туда не попадет, пока не разлогинится и не авторизуется заново. Вот такая заморочка.
Формируем задачу
И так. Хочу кнопку «переавторизировать» и «разлогинить».
При этом, если я деактивирую пользователя или меняю ему группу – то пусть модуль автоматически делает пользователю логаут (выкидывает из авторизированной сессии) или переавторизацию соответственно.
Реализация
Мы выяснили, что чужую сессию разорвать мы не можем. И Битрикс тут не при чем. Зато у Битрикса есть много других полезных функций, которые нужно просто умело применить.
У нас в распоряжении есть стандартная функция Битрикса, которая делает логаут пользователю – она применяется, когда пользователь нажимает кнопку «выйти». Т.е. сам он свою сессию вполне способен прервать. Тогда нам остается просто подсунуть ему незаметно эту самую функцию.
Вот что у нас получилось. Мы в админке сайта деактивируем (меняем группу, разлогиниваем) пользователя. Битрикс запоминает наши действия. И при обновлении страницы указанный пользователь получает незаметно для него срабатывающую функцию выхода (или переавторизации).
И да, право на последний выстрел у него останется. Если последнее действие его было удаление сайта – он это успеет сделать, т.к. логаут произойдет только уже после выполнения последнего действия. Но мы же его не будем предварительно предупреждать, что это его последний ход :)
И ещё. Чтобы Битрикс знал, что указанному пользователю нужно подсовывать упомянутые функции, мы должны где то хранить эти указания. Для этого создается специальная табличка в базе данных, в которую модуль будет заглядывать при каждом хите (переходе по сайту) пользователей. Т.к. эта табличка будет почти всегда пустая (надеюсь банить пользователей не часто приходится), то это небольшая жертва для нас (модуль статистики генерирует куда больше запросов при каждом хите).
Модуль живет тут: Принудительное разлогирование пользователей
Дополнительный заголовок: Мне всегда хотелось иметь кнопку «замочить» в списке пользователей...