Найти - Пользователи
Полная версия: Вывод каптчи после нескольких попыток авторизации
Начало » Django » Вывод каптчи после нескольких попыток авторизации
1
chegivara
Всем привет!

Необходимо выводить рекаптчу после нескольких неудачных попыток аутентификации.

Алгоритм выбрал такой:
Для каждого пользователя хранить в базе счетчик неправильных попыток и сбрасывать его при правильном логине,если счетчик больше 3 то показывать каптчку

Код.
Попытка авторизации:

if request.method == 'POST':
form = AuthForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(username=username, password=password)
Дальше проверка аутентификации:
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
#Redirect to a success page.
return HttpResponseRedirect('/')
else:
# Return a 'disabled account' error message
return render_to_response('login.html', {'form' : form, 'error_login': 1})
else:
Заношу в базу логин под которым пытались авторизоваться и проверяю если такой логин уже есть в базе то смотрю его значение count и если оно равно трём то вывожу каптчу( return render_to_response('login.html', {'form' : form, ‘error_login’: 1,'html_captcha' : html_captcha}):
if Badlogin.objects.filter(username = username):
p = Badlogin.objects.get(username = username)
if p.count < 3:
p.count +=1
p.save()
return render_to_response('registration/login.html', {'form' : form, 'error_login': 1})
else:
p = Badlogin(username = username, count = 1)
p.save()
return render_to_response('registration/login.html', {'form' : form, 'error_login': 1})
Код проверки каптчи такой:
check_captcha = captcha.submit(request.POST['recaptcha_challenge_field'],
request.POST['recaptcha_response_field'],
settings.RECAPTCHA_PRIVATE_KEY, request.META['REMOTE_ADDR'])
if check_captcha.is_valid is False:
form = AuthForm()
return render_to_response('login.html', {'form' : form, 'error_captcha' : 1, 'html_captcha' : html_captcha})
Вот только как мне проверять каптчу? Отдаю пользователю страницу с каптчей, а где мне её проверять?

Весь код:
from django import forms
from recaptcha.client import captcha
from django.conf import settings
from django.shortcuts import render_to_response
from django.contrib.auth import authenticate, login
from django.http import HttpResponseRedirect
from callme.models import Badlogin

class AuthForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput())

html_captcha = captcha.displayhtml(settings.RECAPTCHA_PUB_KEY)
def auth(request):
if request.method == 'POST':
form = AuthForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
if Badlogin.objects.filter(username = username, count = 3):
check_captcha = captcha.submit(request.POST['recaptcha_challenge_field'], request.POST['recaptcha_response_field'], settings.RECAPTCHA_PRIVATE_KEY, request.META['REMOTE_ADDR'])
if check_captcha.is_valid is False:
form = AuthForm()
return render_to_response('registration/login.html', {'form' : form, 'error_captcha' : 1, 'html_captcha' : html_captcha})
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# Redirect to a success page.
return HttpResponseRedirect('/')
else:
# Return a 'disabled account' error message
return render_to_response('registration/login.html', {'form' : form, 'error_login': 1})
else:
# Return an 'invalid login' error message.
if Badlogin.objects.filter(username = username):
p = Badlogin.objects.get(username = username)
if p.count < 3:
p.count +=1
print p
p.save()
else:
p = Badlogin(username = username, count = 1)
p.save()
return render_to_response('registration/login.html', {'form' : form, 'error_login': 1})
else:
form = AuthForm()
return render_to_response('registration/login.html', {'form': form})
Werevolff
Геморрой. Не проще капчу воткнуть так, чтобы она всегда отображалась? Боту будет не сладко, а пользователь примет это легче, чем капчу, которая будет то появляться, то исчезать при входе.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB