Как предотвратить одновременный вход пользователей на сайт PHP / MySQL? - PullRequest
10 голосов
/ 25 июля 2010

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

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

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

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

Спасибо, Сид

Ответы [ 6 ]

7 голосов
/ 25 июля 2010

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

2 голосов
/ 25 июля 2010

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

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

0 голосов
/ 25 июля 2010

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

0 голосов
/ 25 июля 2010

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

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

0 голосов
/ 25 июля 2010

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

0 голосов
/ 25 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...