Как предотвратить одновременные логины пользователей на сайте PHP/MySQL?

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

Я уже установил таблицу, содержащую данные регистрации пользователя с regID как первичный ключ. Моя мысль заключается в создании таблицы истории входа с именем пользователя в качестве первичного ключа, внешнего ключа для имени пользователя в таблице регистрации. В таблице истории входа будет просто отметка времени, когда пользователь войдет на сайт. Однако это не приведет к моей цели - предотвратить использование одним и тем же именем входа более одного человека.

Вместо этого было бы лучше иметь поле состояния входа либо в истории входа в систему, либо в таблице пользователя, которая установлена ​​в 1 для входа в систему и 0 для выхода из системы? Для обновления значения при входе в систему и при выходе из системы потребуется хранить хранимую процедуру, и ее необходимо будет проверить, когда пользователь войдет в систему, так что если статус входа = 1, пользователь уже зарегистрировался и не может войти во второй раз. Это приемлемый подход?

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

Спасибо, Sid

Ответ 1

Если вам нужно выйти из уже зарегистрированного пользователя, если кто-то еще входит в систему с одинаковыми учетными данными, вы можете сделать следующее: когда пользователь регистрируется в произвольном порядке для создания этого идентификатора в вашей базе данных для этого пользователя и тот же в cookie. Эти два должны соответствовать аутентификации.

Ответ 2

Не сворачивая собственный обработчик сеанса, вы можете сделать небольшое параллельное отслеживание. Когда пользователь входит в систему, вы можете сохранить идентификатор сеанса пользователя и время входа в базу данных (возможно, внутри таблицы информации пользователя). После этого login script может проверить наличие, если этот идентификатор sessionID и разрешить/запретить вход в систему на основе наличия идентификатора сеанса. Если идентификатор пуст/пуст, то пользователь входит в систему. Если есть идентификатор сеанса, и он больше, чем X минут, разрешите вход в систему. Иначе откажите им.

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

Ответ 3

Проблема здесь заключается в том, что пользователь регистрируется (то есть, не вышел ли он).

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

Вы можете принудительно "действовать", если страницы веб-сайта периодически опросают сервер с помощью Javascript.

Ответ 4

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

Ответ 5

Как вы выполняете сеансы пользователя на сервере? Если вы храните их в db, вы можете запросить активные сеансы в любое время, когда кто-то попытается войти в систему и посмотреть, уже ли они там. Конечно, вам, вероятно, также придется проверять временную метку, так как вам не гарантировано, что сеансы исчезнут в session.gc_maxlifetime.

Ответ 6

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

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