Лучший метод в PHP, чтобы пользователь входил в систему с одного компьютера за раз - PullRequest
5 голосов
/ 01 июня 2010

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

Ответы [ 2 ]

4 голосов
/ 01 июня 2010

Установите ключ в вашем сеансе, который вы храните в базе данных в пользовательской таблице:

Таблица пользователя

  • user_id
  • имя пользователя
  • пароль
  • лексема

при входе в систему:

  • создать случайный токен
  • ОБНОВЛЕНИЕ пользователя SET token = 'MyRandomToken' ГДЕ username = 'username' и пароль = 'password';
  • $ _ SESSION ['login_token'] = 'MyRandomToken';

На каждой странице:

  • SELECT user_id, username, token ОТ пользователя WHERE token = '$ _ SESSION [' login_token ']';
  • Если не найден, токен логина больше не действителен.

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

UPDATE

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

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

При входе в систему:

(при условии MySQL:)

SELECT user_id
FROM user
WHERE username='username'
AND password='password'
AND last_access < DATE_SUB(NOW(), INTERVAL 10 MINUTE);

Если строка была найдена, то учетная запись существует, и вход в систему не блокируется другим входом в систему. Возможно, вы захотите разделить это на два запроса (сначала проверьте вход, затем проверьте последний доступ), чтобы получить лучшее сообщение об ошибке для неудачных входов, в противном случае это либо «учетная запись не существует», либо «заблокировано».

На каждой странице:

UPDATE user
SET last_access=NOW()
WHERE user_id='CurrentUserId';
4 голосов
/ 01 июня 2010

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

Одним из решений является наличие в базе данных TIMESTAMP столбца с именем last_active_time. Установите last_active_time в NULL, когда пользователь выходит из системы.

Если last_active_time больше, чем X минут назад (где X - время ожидания), предположим, что время сеанса пользователя истекло, и разрешите подключение из нового местоположения.

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

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