Próbuję uzyskać formularz logowania, który mam w django, aby zezwolić tylko na trzy próby logowania przed przekierowaniem na stronę "pomocy dotyczącej logowania". Obecnie używam wbudowanego widoku "django.contrib.auth.views.login" z niestandardowym szablonem. Jak zmusić go do przekierowania na inną stronę po n nieudanych próbach logowania?Jak ograniczyć liczbę ponownych prób logowania w Django
Odpowiedz
Możesz zapisać sesję, jeśli użytkownik nie mógł się zalogować.
request.SESSION['login_tries'] = 1
a jeśli nie, aby zalogować się ponownie
request.SESSioN['login_tries'] = 2
Jeśli sesja staje się równa kwocie logowania próbuje chcesz je mieć tho, następnie coś zrobić.
W rzeczywistości istnieje projekt, który zapewnia oprogramowanie pośrednie Django do wykonania właśnie tego, o nazwie django-axes
. Po prostu zainstaluj go zgodnie z dostarczonymi instrukcjami, a następnie ustaw AXES_LOGIN_FAILURE_LIMIT
na liczbę prób zalogowania, które chcesz, zanim zostanie utworzony rekord dla nieudanych prób logowania. Nadal musisz sprawdzić ten rekord, gdy chcesz kogoś zablokować.
Dzięki Daniel. Wybrałem odpowiedź Dotty'ego, ponieważ była bliższa metodzie, której użyłem w końcu. Częścią problemu był mój brak doświadczenia z Pythonem i Django i jako taki nie miałem wystarczającej wiedzy, by zadać właściwe pytanie. Myślę, że twoja odpowiedź byłaby równie dobra, jeśli nie lepsza, gdybym chciała czegoś z tak wieloma funkcjami, i mógłbym dobrze skończyć z jego użyciem, gdy lepiej poznałem framework. –
Bez obaw, chciałem tylko poinformować, że istnieje już rozwiązanie, które mogłoby potencjalnie zadziałać. Nie wiedziałem, że to istnieje, więc też nauczyłem się czegoś w tym procesie! –
używam django-brake
i 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:
...
- 1. Jak ograniczyć liczbę ponownych prób wiadomości JMS DefaultMessageListenerContainer?
- 2. Czy OkHttpClient ma maksymalną liczbę ponownych prób
- 3. Jak ustawić liczbę ponownych prób dla Sidekiq przy pomocy ActiveJob?
- 4. Zmiana liczby ponownych prób żądań w boto3
- 5. Pakowanie ponownych prób w blok `with` (
- 6. Jak ograniczyć liczbę dziesiętną?
- 7. Python: requests.exceptions.ConnectionError. Maksymalna liczba ponownych prób przekroczyła adres URL:
- 8. JTextField: Jak ograniczyć liczbę znaków?
- 9. Jak ograniczyć liczbę wierszy w PostgreSQL SELECT
- 10. Jak ograniczyć liczbę przesyłanych plików w html?
- 11. Python multiprocessing: jak ograniczyć liczbę oczekujących procesów?
- 12. redis jak ograniczyć liczbę zwrotną polecenia KEYS?
- 13. django: Jak ograniczyć opcje pól w formularzu?
- 14. Jak ograniczyć liczbę znaków wprowadzanych przez cin?
- 15. Czy mogę ograniczyć liczbę znaków w TextView?
- 16. Jak określić # nieudanych prób logowania dla blokady konta w MVC 4 z domyślnym dostawcą simplemembership
- 17. jak ograniczyć liczbę znaków w ng-bind-html w AngularJS?
- 18. Jak ograniczyć liczbę stron śledzonych w witrynie w Pythonie Scrapy
- 19. Jak OGRANICZYĆ liczbę wierszy w opcji USUŃ w programie DB2?
- 20. Jak ograniczyć liczbę wątków/podprocesów używanych w funkcji w bash?
- 21. Django niestandardowa strona logowania
- 22. AS400.validateSignon() nie resetuje nieudanych prób logowania się do 0
- 23. Jak ograniczyć liczbę znaków do wklejenia w polu tekstowym?
- 24. Jak mogę ograniczyć liczbę wyników o określoną kolumnę w postgreSQL?
- 25. Jak ograniczyć liczbę wartości systematyki w poście Wordpress?
- 26. Jak ograniczyć liczbę języków wyświetlanych w oknie publikowania Sitecore?
- 27. Jak ograniczyć maksymalną liczbę równoległych wątków w perlu
- 28. Jak mogę ograniczyć liczbę punktów przed sortowaniem w zapytaniu Solr?
- 29. XSD: jak ograniczyć liczbę znaków w atrybucie typu łańcucha?
- 30. Jak ograniczyć liczbę znaków wprowadzonych w oknie dialogowym alertu EditText
Sesja będzie istnieć tylko wtedy, gdy klient wysyła nagłówki Cookie, które nie będą robić brute force atakujący. Lepiej połączyć próby logowania z konkretnym kontem użytkownika lub konkretnym klientem (lub oboma). –