make_password - Cumplimiento de los requisitos de seguridad de la contraseña con django.contrib.auth.views.password_change
login url django (5)
Acabo de instalar las contraseñas de django y dejar que se las arregle por usted: https://github.com/dstufft/django-passwords
Después de eso, simplemente puede subclasificar el formulario de registro y reemplazar el campo con un PasswordField.
Tenemos una aplicación Django que requiere un nivel específico de complejidad de contraseña. Actualmente aplicamos esto a través de JavaScript del lado del cliente que puede ser fácilmente derrotado por alguien que tenga la motivación adecuada.
Parece que no puedo encontrar ninguna información específica sobre la configuración de la validación de la seguridad de la contraseña del lado del servidor utilizando las vistas integradas de django contrib. Antes de volver a inventar la rueda, ¿hay una forma adecuada de manejar este requisito?
Como algunos eludieron con los validadores personalizados, este es el enfoque que tomaría ...
Crear un validador:
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _
def validate_password_strength(value):
"""Validates that a password is as least 7 characters long and has at least
1 digit and 1 letter.
"""
min_length = 7
if len(value) < min_length:
raise ValidationError(_(''Password must be at least {0} characters ''
''long.'').format(min_length))
# check for digit
if not any(char.isdigit() for char in value):
raise ValidationError(_(''Password must contain at least 1 digit.''))
# check for letter
if not any(char.isalpha() for char in value):
raise ValidationError(_(''Password must contain at least 1 letter.''))
Luego agregue el validador al campo de formulario que desea validar:
from django.contrib.auth.forms import SetPasswordForm
class MySetPasswordForm(SetPasswordForm):
def __init__(self, *args, **kwargs):
super(MySetPasswordForm, self).__init__(*args, **kwargs)
self.fields[''new_password1''].validators.append(validate_password_strength)
Creo que debería escribir su propio validador (o usar RegexValidator, ver: http://docs.djangoproject.com/en/dev/ref/validators/ ) si usa formularios o escribe algún otro script para verificar expresiones regulares. Esto debería ser una tarea simple. Además, no creo que haya ningún mecanismo incorporado, simplemente porque cada persona entiende el concepto de "contraseña segura" un poco diferente.
Django 1.9 ofrece una validación de contraseña incorporada para ayudar a prevenir el uso de contraseñas débiles por parte de los usuarios. Se habilita modificando la configuración AUTH_PASSWORD_VALIDATORS
en nuestro proyecto. Por defecto, Django viene con los siguientes validadores:
-
UserAttributeSimilarityValidator
, que verifica la similitud entre la contraseña y un conjunto de atributos del usuario. -
MinimumLengthValidator
, que simplemente verifica si la contraseña cumple una longitud mínima. Este validador está configurado con una opción personalizada: ahora requiere que la longitud mínima sea de nueve caracteres, en lugar de los ocho predeterminados. -
CommonPasswordValidator
, que verifica si la contraseña aparece en una lista de contraseñas comunes. De forma predeterminada, se compara con una lista incluida de 1000 contraseñas comunes. -
NumericPasswordValidator
, que verifica si la contraseña no es totalmente numérica.
Este ejemplo habilita los cuatro validadores incluidos:
AUTH_PASSWORD_VALIDATORS = [
{
''NAME'': ''django.contrib.auth.password_validation.UserAttributeSimilarityValidator'',
},
{
''NAME'': ''django.contrib.auth.password_validation.MinimumLengthValidator'',
''OPTIONS'': {
''min_length'': 9,
}
},
{
''NAME'': ''django.contrib.auth.password_validation.CommonPasswordValidator'',
},
{
''NAME'': ''django.contrib.auth.password_validation.NumericPasswordValidator'',
},
]
También fui con un formulario personalizado para esto. En urls.py
especifique su formulario personalizado:
(r''^change_password/$'', ''django.contrib.auth.views.password_change'',
{''password_change_form'': ValidatingPasswordChangeForm}),
Heredar de PasswordChangeForm
e implementar la validación:
from django import forms
from django.contrib import auth
class ValidatingPasswordChangeForm(auth.forms.PasswordChangeForm):
MIN_LENGTH = 8
def clean_new_password1(self):
password1 = self.cleaned_data.get(''new_password1'')
# At least MIN_LENGTH long
if len(password1) < self.MIN_LENGTH:
raise forms.ValidationError("The new password must be at least %d characters long." % self.MIN_LENGTH)
# At least one letter and one non-letter
first_isalpha = password1[0].isalpha()
if all(c.isalpha() == first_isalpha for c in password1):
raise forms.ValidationError("The new password must contain at least one letter and at least one digit or" /
" punctuation character.")
# ... any other validation you want ...
return password1