2015-04-10 19 views
12

Sto tentando di aggiungere la convalida della password personalizzata all'utente di creazione e modificare i moduli di amministrazione della password. Non ho visto nulla nei documenti del django su come farlo. Ho trovato questo post su SO: Enforcing password strength requirements with django.contrib.auth.views.password_change, che fornisce 2 soluzioni. Ho provato entrambi, ma nessuno dei due ha funzionato.convalida password personalizzata in django 1.7

Ecco quello che ho adesso nel mio app admin.py:

def validate_password_strength(value): 
    """Validates that a password is as least 10 characters long and has at least 
    2 digits and 1 Upper case letter. 
    """ 
    min_length = 10 

    if len(value) < min_length: 
     raise ValidationError(_('Password must be at least {0} characters ' 
           'long.').format(min_length)) 

    # check for 2 digits 
    if sum(c.isdigit() for c in value) < 2: 
     raise ValidationError(_('Password must container at least 2 digits.')) 

    # check for uppercase letter 
    if not any(c.isupper() for c in value): 
     raise ValidationError(_('Password must container at least 1 uppercase letter.')) 

class MySetPasswordForm(SetPasswordForm): 
    def __init__(self, *args, **kwargs): 
     super(MySetPasswordForm, self).__init__(*args, **kwargs) 
     self.fields['password1'].validators.append(validate_password_strength) 

Ma quello che non riesco a capire è come faccio a MySetPasswordForm da utilizzare.

Ho provato alcune cose diverse. Per prima cosa ho fatto questo:

class UserAdmin(UserAdmin): 
    form = MySetPasswordForm 

# Re-register UserAdmin 
admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 

E ho ottenuto questo errore:

<class 'elex_apis.energy.webservice.admin.UserAdmin'>: (admin.E016) The value of 'form' must inherit from 'BaseModelForm'. 

Così poi ho cambiato MySetPasswordForm ereditare da BaseModelForm e poi ho ottenuto questo errore:

__init__() missing 1 required positional argument: 'user' 

Allora Ho aggiunto il parametro utente in modo che ora MySetPasswordForm assomigli a questo:

class MySetPasswordForm(BaseModelForm): 
    def __init__(self, user, *args, **kwargs): 
     super(MySetPasswordForm, self).__init__(user, *args, **kwargs) 
     self.fields['password1'].validators.append(validate_password_strength) 

Ma ho ancora lo stesso errore di prima.

Non riesco a credere che sia così difficile aggiungere un validatore di password. Deve essere un bisogno molto comune, quindi chiaramente mi manca qualcosa di semplice. Qualcuno può fornire assistenza qui.

risposta

7

Il modo più semplice è ereditare l'originale UserAdmin e ignorare lo change_password_form.

Esempio: "No password impostata"

from django.contrib.auth import models as auth_models 
from django.contrib.auth import admin as auth_admin 
from django.contrib.auth import forms as auth_forms 
from django.core.exceptions import ValidationError 


def validate_password_strength(value): 
    """Validates that a password is as least 10 characters long and has at least 
    2 digits and 1 Upper case letter. 
    """ 
    min_length = 10 

    if len(value) < min_length: 
     raise ValidationError(_('Password must be at least {0} characters ' 
           'long.').format(min_length)) 

    # check for 2 digits 
    if sum(c.isdigit() for c in value) < 2: 
     raise ValidationError(_('Password must container at least 2 digits.')) 

    # check for uppercase letter 
    if not any(c.isupper() for c in value): 
     raise ValidationError(_('Password must container at least 1 uppercase letter.')) 

    return value 


class AdminPasswordChangeForm(auth_forms.AdminPasswordChangeForm): 
    def clean_password1(self): 
     return validate_password_strength(self.cleaned_data['password1']) 


class UserCreationForm(auth_forms.UserCreationForm): 
    def clean_password1(self): 
     return validate_password_strength(self.cleaned_data['password1']) 


class UserAdmin(auth_admin.UserAdmin): 
    change_password_form = AdminPasswordChangeForm 
    add_form = UserCreationForm 


# Re-register UserAdmin 
admin.site.unregister(auth_models.User) 
admin.site.register(auth_models.User, UserAdmin) 
+0

Questo fa convalidare la password, ma quando dopo una password valida è iscritto e di amministrazione torna alla pagina precedente, si dice Tuttavia quando guardo nel database c'è una password in auth_user. –

+1

@LarryMartell: oops ... ha dimenticato di aggiungere il 'valore restituito', prova con la nuova versione :) – Wolph

+0

Perfetto! Grazie mille!! –