Django - установка неактивного пользователя на 5 секунд - PullRequest
1 голос
/ 21 октября 2019

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

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

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

Вот мой код: models.py:

class User(AbstractUser):
    loginAttempts = models.IntegerField(default=0)

views.py:

if user.check_password(data.get("password")):
        user.loginAttempts = 0
        user.save()
        auth.login(request, user)
        return JsonResponse({'message': 'Successfully logged in'}, status=200)
else:
        user.loginAttempts += 1
        user.save()
        if user.loginAttempts >= 7:
            user.is_active = False
            user.save()
            return JsonResponse({'message': 'Account Locked.'}, status=400)
        else: 
            return JsonResponse({'message': 'Oops, username/email or password provided is invalid'}, status=400)

В настоящее время ошибкасообщение («Учетная запись заблокирована») успешно отображается после 7 попыток, однако я хочу, чтобы переменная loginAttempts была установлена ​​в 0 через 5 секунд.

Как я могу это сделать? Спасибо.

1 Ответ

0 голосов
/ 21 октября 2019

Вам необходимо добавить дополнительное поле к объекту User с именем somethign, например lastLoginTry. Затем вы можете проверить, была ли последняя попытка более 5 секунд назад.

РЕДАКТИРОВАТЬ: не рекомендуется сообщать кому-либо, когда он пытается войти в свою учетную запись, что его учетная запись была заблокирована в течение некоторого времени, потому что если кто-тохочет взломать учетную запись, просто попробовав несколько адресов электронной почты, с которых он даже не знает, существует ли учетная запись с таким адресом электронной почты, он узнает после получения этого ответа. Так что просто оставайтесь в "ooops, user / password invalid" и сообщите пользователю, что его учетная запись будет заблокирована после определенного количества попыток входа в систему.

import time
if user.check_password(data.get("password")):
        user.loginAttempts = 0
        user.save()
        auth.login(request, user)
        return JsonResponse({'message': 'Successfully logged in'}, status=200)
else:
        user.loginAttempts += 1
        if user.loginAttempts >= 7:
            if time.time() - user.lastFailedLogin >= 5:
                user.is_active = True
                user.loginAttempts = 0
            else:
                user.is_active = False
                user.lastFailedLogin = time.time()
        user.save()
        return JsonResponse({'message': 'Oops, username/email or password provided is invalid'}, status=400)

У меня не так много времени, чтобы проверить это сейчас,Если кто-то найдет какие-нибудь ошибки или нет, не стесняйтесь редактировать мой ответ !!

...