PHP — Остановить одновременные входы пользователей

#php #mysql #session #login #user-management

#php #mysql #сессия #аутентификация #управление пользователями

Вопрос:

Мне нужен метод остановки одновременных входов в систему с использованием PHP / MySQL.

Текущая настройка

В настоящее время в системе, которую я построил внутри, где я работаю, 2 человека используют один и тот же логин. Из-за особенностей системы я не хочу, чтобы они оба входили в систему.

Что я пробовал

Около 10 статей о stackoverflow и я гуглил столько, сколько мог.

Я также попытался добавить поле «loggedin» в таблицу пользователей, которое при входе в систему было установлено в 1, а при выходе из системы — в 0. Тогда, если при входе в систему используются те же учетные данные пользователя, это приведет к сбою.

Проблема, с которой я столкнулся, заключалась в том, что если пользователь, вошедший в систему, закрывал браузер без надлежащего выхода из системы, это не приводило к обновлению базы данных. Затем я получаю телефонный звонок от этого человека, и мне пришлось бы сбросить значение в 0 в базе данных.

В дальнейшем это невозможно, поскольку продукт скоро будет распространен среди примерно 20 человек внутри компании.

Что мне нужно

Что мне нужно, так это найти способ, чтобы при закрытии браузера выполнялся скрипт для обновления базы данных. Альтернативный способ чтения каждого текущего сеанса на сервере, которым я мог бы манипулировать, или что-то еще.

Ограничения

Наши хостинг-провайдеры ужасны, и впоследствии изменения, которые я могу внести на сервер, ограничены / невозможны. Хостинг — это решение для совместного размещения.

Комментарии:

1. Измените пароль. Но это не будет иметь значения, если человек x сообщит человеку y новый пароль.

Ответ №1:

Что мне нужно, так это найти способ, чтобы при закрытии браузера выполнялся скрипт для обновления базы данных.

Вы не можете.

Вашим лучшим решением может быть сопоставление идентификатора сеанса с пользователем в базе данных. Если идентификатор сеанса на компьютере пользователя не совпадает с самым последним идентификатором сеанса в базе данных, заставьте их войти в систему и обновить базу данных.

Комментарии:

1. Вероятно, это практически единственный способ убедиться, что вы сохраняете один вход для каждого пользователя. При входе в систему сохраните сеанс с пользователем в базе данных. После этого вы просто проверяете, что сеанс с учетной записью пользователя совпадает с сеансом пользователя, пытающегося загрузить страницу. Если это не соответствует, выйдите из системы и принудительно выполните повторный вход.

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

3. Пользователь 1 входит в систему как ‘user’ и получает идентификатор сеанса ‘ABC’. Вы сохраняете ‘ABC’ в базу данных в строке для ‘user’. Пользователь 2 входит в систему как ‘user’ и получает идентификатор сеанса ‘DEF’. Вы сохраняете ‘DEF’ в базе данных. В следующий раз, когда пользователь 1 что-либо сделает, ваш скрипт увидит, что ‘ABC’ больше не является правильным идентификатором сеанса для ‘user’, и завершит их.

4. Хорошо, это имеет смысл. Но проблема в том, что приложение используется для создания электронных писем. Теперь, хотя приложение выполняет автосохранение каждые 5 секунд, оно все равно будет раздражать всех, кто когда-либо входил в систему, тем, что они вышли из системы. И тогда я получу по шее. @ceejayoz @Jonathon Kuhn

5. Тогда правильным ответом на это должно быть «прекратить совместное использование имен пользователей».

Ответ №2:

возможно, вам следует изменить это.

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

таким образом, одновременно может входить только один пользователь.

Комментарии:

1. Согласен. Это идеальный способ.

Ответ №3:

Надежного способа сделать это не существует по самой природе HTTP. Но если вы можете справиться с некоторым временем задержки, есть решение.

Лучшее, что вы могли бы сделать, это заставить JS-скрипт запускать скрипт «keep-alive» на вашем сервере. Делайте это каждые 30 секунд или около того. Если ваш сервер не получил ответа от клиента в течение 1 минуты, закройте сеанс.

Комментарии:

1. Это происходит, если каждый пользователь получает только один сеанс… Я предполагал, что он настроил бы свою систему учетных записей таким образом, но это, вероятно, было неправильным предположением. Спасибо.

Ответ №4:

Вы можете использовать поле «loggedin», но добавив другое поле «loggedin_timestamp». Затем вы проверяете, когда пользователь входил в систему в последний раз.

Если это больше, чем время сохранения сеанса, вы разрешаете ему снова войти в систему автоматически

Ответ №5:

Я использовал скрипт jquery delay time out session для автоматического выхода из системы. Скрипт вызовет php-скрипт, с помощью которого мы можем изменить отметку времени окончания сеанса базы данных. Итак, я думаю, что эта ссылка поможет вам. Время простоя Jquery истекло