2015-04-10 26 views
12

Tôi đang cố gắng thêm xác thực mật khẩu tùy chỉnh cho người dùng tạo và thay đổi biểu mẫu quản trị mật khẩu. Tôi không thấy bất cứ điều gì trong tài liệu django về cách làm điều này. Tôi tìm thấy bài đăng này trên SO: Enforcing password strength requirements with django.contrib.auth.views.password_change, cung cấp 2 giải pháp. Tôi đã thử cả hai, nhưng không làm việc cho tôi.xác thực mật khẩu tùy chỉnh trong django 1.7

Dưới đây là những gì tôi có bây giờ trong các ứng dụng admin.py tôi:

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) 

Nhưng những gì tôi không thể hình dung ra là làm thế nào để tôi nhận được MySetPasswordForm được sử dụng.

Tôi đã thử một vài điều khác nhau. Trước tiên tôi đã làm điều này:

class UserAdmin(UserAdmin): 
    form = MySetPasswordForm 

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

Và tôi đã nhận lỗi này:

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

Vì vậy, sau đó tôi đã thay đổi MySetPasswordForm kế thừa từ BaseModelForm và sau đó tôi đã nhận lỗi này:

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

Vì vậy, sau đó Tôi đã thêm thông số người dùng để bây giờ MySetPasswordForm trông giống như sau:

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

Nhưng tôi vẫn gặp lỗi giống như trước đây.

Tôi không thể tin rằng thật khó để thêm trình xác thực mật khẩu. Nó phải là một nhu cầu rất phổ biến, vì vậy rõ ràng tôi phải thiếu một cái gì đó đơn giản. Bất cứ ai có thể vui lòng cung cấp một số trợ giúp ở đây.

Trả lời

7

Cách dễ nhất là kế thừa số UserAdmin gốc và chỉ ghi đè change_password_form.

Ví dụ: "Không đặt mật khẩu"

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

này không xác nhận mật khẩu, nhưng khi sau một mật khẩu hợp lệ được nhập và quản trị trở về trang trước, nó nói Tuy nhiên khi tôi nhìn vào cơ sở dữ liệu có một mật khẩu trong auth_user. –

+1

@LarryMartell: oops ... quên thêm 'giá trị trả lại', hãy thử với phiên bản mới :) – Wolph

+0

Hoàn hảo! Cảm ơn bạn rất nhiều!! –

Các vấn đề liên quan