Лучший метод в PHP для создания пользователя входит в систему от одной машины за один раз

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

5
задан Joe 27 July 2012 в 08:28
поделиться

2 ответа

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

Таблица User

  • user_id
  • username
  • password
  • token

On Login:

  • создаем случайный токен
  • UPDATE user SET token='MyRandomToken' WHERE username='username' and password='password';
  • $_SESSION['login_token'] = 'MyRandomToken';

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

  • SELECT user_id, username, token FROM user WHERE token='$_SESSION['login_token']';
  • Если токен не найден, то токен входа больше не действителен.

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

UPDATE

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

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

On login:

(Assuming 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
ответ дан 14 December 2019 в 04:31
поделиться

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

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

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

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

4
ответ дан 14 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: