Как ограничить количество повторных попыток входа в Django? - PullRequest
5 голосов
/ 10 июня 2010

Я пытаюсь получить форму входа в мою учетную запись в django, чтобы разрешить только три попытки входа в систему до перенаправления на страницу «Помощь при входе». В настоящее время я использую встроенный вид «django.contrib.auth.views.login» с пользовательским шаблоном. Как заставить его перенаправить на другую страницу после n неудачных попыток входа в систему?

Ответы [ 3 ]

11 голосов
/ 10 июня 2010

На самом деле существует проект, который предоставляет промежуточное программное обеспечение Django для этого, называемое django-axes.Просто установите его, следуя предоставленным инструкциям, а затем установите AXES_LOGIN_FAILURE_LIMIT на количество попыток входа в систему, которое вы хотите, прежде чем создать запись для неудачных входов в систему.Однако вам все равно придется проверить эту запись, если вы хотите кого-то заблокировать.

0 голосов
/ 31 октября 2013

я использую django-brake и memcached

@ratelimit(field='email', method='POST', rate='5/m')
@ratelimit(field='email', method='POST', rate='10/h')
@ratelimit(field='email', method='POST', rate='20/d')
def login_failure(request, login_form):
    """
    Increment cache counters, 403 if over limit.
    """
    was_limited = getattr(request, 'limited', False)
    if was_limited:
        limits = getattr(request, 'limits', [])
        login_form.full_clean()
        login_form._errors.setdefault(NON_FIELD_ERRORS, ErrorList())\
            .append('accout locked, try '+ str(limits[0]['period']) + ' seconds later')
        return render(request, 'user/login.html', {'form': login_form})


def login(request):

    if request.method == 'GET':
        next = request.GET.get('next', '')
        return render(request, 'user/login.html', {'next': next})
    elif request.method == 'POST':
        login_form = LoginForm(request.POST)

        # check first 
        from brake.utils import get_limits
        limits = get_limits(request, 'login_failure', 'email', [60, 3600, 86400])
        if limits:
            login_form.full_clean()
            login_form._errors.setdefault(NON_FIELD_ERRORS, ErrorList())\
                .append('accout locked, try '+ str(limits[0]['period']) + ' seconds later')
            return render(request, 'user/login.html', {'form': login_form})

        if login_form.is_valid():

                email = login_form.cleaned_data['email']
                submit_pwd = login_form.cleaned_data['password']

                user = authenticate(username=email, password=submit_pwd)

                if user is None:
                     # 
                    res = login_failure(request, login_form)
                    if res is None:
                        login_form._errors.setdefault(NON_FIELD_ERRORS, ErrorList()).append('password wrong')
                        res = render(request, 'user/login.html', {'form': login_form})
                    return res

                ...
                login etc...
        else:

        ...
0 голосов
/ 10 июня 2010

Вы можете сохранить сеанс, если пользователь не смог войти в систему.

request.SESSION['login_tries'] = 1

и если они не смогут войти снова

request.SESSioN['login_tries'] = 2

Если сессия становится равной количеству попыток входа в систему, которое вы хотите получить, то сделайте что-нибудь.

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