2012-02-28 5 views
8

Implementuję uwierzytelnianie w witrynie Django przy użyciu the built-in auth module, w tym the built-in UserCreationForm.Jak ustawić minimalną długość hasła podczas korzystania z wbudowanego modułu auth Django?

Chciałbym ustawić minimalną długość dla haseł. Jednak nie mogę znaleźć żadnej dokumentacji, jak to zrobić.

Czy mogę skonfigurować modułmodułu auth, aby wymagał tego na poziomie bazy danych? Czy powinienem podklasować UserCreationForm (robię to już z innych powodów) i dodać dodatkowy weryfikator, który wymusza długość hasła?

Odpowiedz

8

Szczególnie jeśli używasz już podkatalogu UserCreationForm, powiedziałbym, że powinieneś po prostu dodać do niego sprawdzanie poprawności. Powinieneś być w stanie zastąpić metodę clean_password na formularzu:

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 pytania: 1) Dlaczego warto korzystać z super() tutaj? Dlaczego nie "zwrócić hasła"? 2) Otrzymuję obiekt 'AttributeError: 'super' nie ma atrybutu" clean_password ". Co może spowodować? –

+1

Powinno to być 'clean_password1', a nie' clean_password' (i 'self.cleaned_data.get ('password1')'), ponieważ UserCreationForm ma 'password1' i' password2' dla potwierdzenia. –

+0

Jest lepszy sposób. Zobacz inną odpowiedź: https://stackoverflow.com/a/39714008/3708462 –

5

instacji forma tworzenie użytkownik brzmi jak dobry podejście. Nie można go wymusić na poziomie bazy danych, ponieważ Django przechowuje tylko skrót hasła.

+0

Aha, świetny punkt. –

1

/django/contrib/auth/password_validation.py Zawiera klasy MinimumLengthValidator z domyślnie minimalną długość hasł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

Myślę, że najprostszym sposobem osiągnięcia tego celu używa Django password validation

Dla minimalnej długości będzie wystarczy dodanie tego do pliku ustawień:

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

są inni zatwierdzające jak NumericPasswordValidator się nd CommonPasswordValidator

+0

To jest lepsza odpowiedź! Nie używaj czystych metod, jeśli wbudowany jest mechanizm password_validation! – allcaps

+0

To powinna być zaakceptowana odpowiedź. –