@VadimKholodilo

Как правильно реализовать систему блокировки пользователя?

Здравствуйте. В своем приложении реализую систему авторизации. После нескольких неудачных попыток входа, пользователь должен быть заблокирован и разблокирован после нескольких часов.
Как сделал это я:
есть таблица пользователей, в которой есть идентификатор, логин, хеш от пароля, соль и другая служебная информация.
Есть таблица, в которую добавляются все неудачные попытки входа. Она имеет следующую структуру: идентификатор пользователя (Внешний ключ на идентификатор в таблице с пользователями), IP, количество неудачных попыток.
Также в этой таблице есть триггер, который срабатывает при вставке и обновлении. Если попыток входа > 5, то пользователь добавляется в таблицу, где находятся все заблокированные пользователи. Эта таблица имеет следующую структуру: идентификатор пользователя (Внешний ключ на таблицу с пользователя), время блокировки (Когда пользователь был заблокирован), время разблокировки (Когда пользователя надо разблокировать).
Есть процедура, которая запускается с помощью планировщика и разблокирует пользователей, у которых время разблокировки пришло.

Что можете сказать насчёт моего решения?
П.С. Используется база данных Postgresql.
Да, решение работает, но хотелось бы сделать так, как делать надо, а не что-нибудь, что лишь бы работало.
  • Вопрос задан
  • 688 просмотров
Решения вопроса 1
@ComodoHacker
Можно обойтись одной таблицей с неудачными попытками. Структура:

  • ID пользователя
  • IP адрес
  • Дата/время

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

Обновлять дополнительно ничего не нужно. Периодически можно чистить таблицу.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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