Estoy tratando de obtener un formulario de acceso que tengo en django para permitir solo tres intentos de inicio de sesión antes de redirigir a una página de "ayuda para el inicio de sesión". Actualmente estoy usando la vista "django.contrib.auth.views.login" incorporada con una plantilla personalizada. ¿Cómo lo obligo a redirigir a otra página después de n intentos fallidos de inicio de sesión?Cómo limito la cantidad de intentos de inicio de sesión en Django
Respuesta
Puede guardar una sesión si el usuario no ha podido iniciar sesión.
request.SESSION['login_tries'] = 1
y si no logran conectarse de nuevo
request.SESSioN['login_tries'] = 2
Si la sesión se hace igual a la cantidad de inicio de sesión intenta usted quiere que aunque tienen, a continuación, hacer algo.
En realidad, existe un proyecto que proporciona un middleware de Django para hacer esto, llamado django-axes
. Simplemente instálelo con las instrucciones provistas y luego configure AXES_LOGIN_FAILURE_LIMIT
con la cantidad de intentos de inicio de sesión que desee antes de crear un registro para los inicios de sesión fallidos. Sin embargo, aún tendrá que verificar este registro cuando quiera bloquear a alguien.
Gracias Daniel. Escogí la respuesta de dotty porque estaba más cerca del método que terminé usando. Parte del problema era mi propia inexperiencia con Python y Django y, como tal, no tenía los conocimientos suficientes para formular la pregunta correcta. Creo que tu respuesta hubiera sido igual de buena o incluso mejor si hubiera deseado algo con tantas características, y es posible que termine usándolo cuando esté más familiarizado con el framework. –
No se preocupe, solo quería hacerle saber que ya había una solución que potencialmente podría funcionar. ¡Yo tampoco sabía que existía, así que aprendí algo en el proceso también! –
yo uso django-brake
y 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. Cómo retrasar los intentos de inicio de sesión después de demasiados intentos (PHP)
- 2. Seguimiento de intentos de inicio de sesión utilizando cookies PHP
- 3. Limitación del número de intentos de inicio de sesión fallidos
- 4. ¿Cómo limito la cantidad de resultados devueltos de grep?
- 5. ¿Cómo acelerar los intentos de inicio de sesión en Java webapp?
- 6. ¿Cómo limito la cantidad de registros devueltos para Interbase 7.1?
- 7. ¿La redirección de inicio de sesión de Django no funciona?
- 8. ¿Cómo extiendo el formulario de "inicio de sesión" de Django?
- 9. Configuración elegante de inicio de sesión de Python en Django
- 10. Django: HTTPS solo para la página de inicio de sesión?
- 11. inicio de sesión() en el marco de prueba de Django
- 12. Ataques de inicio de sesión de fuerza bruta en Django
- 13. ¿Hay una plantilla de inicio de sesión integrada en Django?
- 14. ¿Cómo limito la cantidad de caracteres ingresados a través de cin?
- 15. ¿Cómo se especifica la url de redirección de inicio de sesión en django?
- 16. ¿Cómo controlar los errores de consulta de MySQL, los tiempos de espera y los intentos de inicio de sesión?
- 17. ¿Cómo limito la cantidad de filas devueltas por esta UNIÓN IZQUIERDA a una?
- 18. Implementación del inicio de sesión único (SSO) con Django
- 19. inicio de sesión de la aplicación Android
- 20. Inicio de sesión en J2ME
- 21. ¿Podemos usar la página de inicio de sesión en/admin en django para nuestro propio uso?
- 22. Django: detectar el inicio de sesión de administrador en la vista o plantilla
- 23. Iniciar sesión en PostgreSQL - Error de inicio de sesión
- 24. Seguir un evento de inicio de sesión en Google Analytics
- 25. página de inicio de sesión en phpmyadmin
- 26. Cómo especificar # de intentos de inicio de sesión fallidos para el bloqueo de cuenta en MVC 4 con el proveedor simplemembership predeterminado
- 27. Caducidad de la sesión Django?
- 28. aumentando la demora de inicio de sesión para detener la fuerza bruta, ¿buena idea?
- 29. Django: Pase la variable al inicio de sesión en el archivo de configuración
- 30. Obtener la señal de inicio de sesión del usuario actual en Django
La sesión sólo existirá si el cliente está enviando encabezados de las cookies, que un atacante fuerza bruta no va a hacer. Sería mejor vincular los intentos de inicio de sesión con una cuenta de usuario específica, o un cliente específico (o ambos). –