2012-02-28 10 views
8

Estoy implementando la autenticación en un sitio de Django usando the built-in auth module, incluido the built-in UserCreationForm.¿Cómo puedo establecer una longitud mínima de contraseña cuando uso el módulo de autenticación de Django incorporado?

Me gustaría establecer una longitud mínima para las contraseñas. Sin embargo, no puedo encontrar ninguna documentación sobre cómo hacer esto.

¿Puedo configurar el módulo User del módulo auth para que lo requiera a nivel de la base de datos? ¿O debería subclasificar el UserCreationForm (en realidad ya lo hago por motivos no relacionados) y agregar un validador adicional que aplique la longitud de la contraseña?

Respuesta

8

Especialmente si ya está utilizando una subclase UserCreationForm, diría que definitivamente debería simplemente agregarle la validación. Usted debe ser capaz de reemplazar el método clean_password en el formulario:

def clean_password(self): 
    password = self.cleaned_data.get('password1') 
    if len(password) < 8: 
     raise ValidationError('Password too short') 
    return super(MyUserCreationForm, self).clean_password1() 
+1

2 preguntas: 1) ¿Por qué usar super() aquí? ¿Por qué no 'devolver contraseña'? 2) Obtengo un objeto 'AttributeError: 'super' no tiene ningún atributo 'clean_password''. ¿Qué podría causar eso? –

+1

Debe ser 'clean_password1' not' clean_password' (y 'self.cleaned_data.get ('password1')') ya que UserCreationForm tiene 'password1' y' password2' para confirmación. –

+0

Hay una mejor manera. Ver otra respuesta: https://stackoverflow.com/a/39714008/3708462 –

5

subclases de la forma de creación de usuario suena como un buen enfoque. No se puede aplicar en el nivel de la base de datos, ya que Django solo almacena un hash de la contraseña.

+0

Aha, un buen punto. –

1

/django/contrib/auth/password_validation.py Contiene MinimumLengthValidator clase con defecto la longitud mínima de la contraseña:

class MinimumLengthValidator(object): 
    """ 
    Validate whether the password is of a minimum length. 
    """ 
    def __init__(self, min_length=8): 
     self.min_length = min_length 

    def validate(self, password, user=None): 
     if len(password) < self.min_length: 
      raise ValidationError(
       ungettext(
        "This password is too short. It must contain at least %(min_length)d character.", 
        "This password is too short. It must contain at least %(min_length)d characters.", 
        self.min_length 
       ), 
       code='password_too_short', 
       params={'min_length': self.min_length}, 
      ) 

    def get_help_text(self): 
     return ungettext(
      "Your password must contain at least %(min_length)d character.", 
      "Your password must contain at least %(min_length)d characters.", 
      self.min_length 
     ) % {'min_length': self.min_length} 
7

Creo que la forma más fácil de lograrlo es usar Django password validation

Para longitud mínima haría ser lo suficientemente añadir esto a la configuración de archivo:

AUTH_PASSWORD_VALIDATORS = [ 
    { 
     'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 
     'OPTIONS': { 
      'min_length': 8, 
     } 
    }, 
] 

hay otros validadores como un NumericPasswordValidator nd CommonPasswordValidator

+0

¡Esta es la mejor respuesta! ¡No juegue con métodos limpios si hay un mecanismo de password_validation incorporado! – allcaps

+0

Esta debería ser la respuesta aceptada. –

Cuestiones relacionadas