التحقق من صحة كلمات مرور المستخدمين الجدد في واجهة إدارة Django

0

هناك لحظة واحدة مثيرة للاهتمام في توثيق Django :

By default, validators are used in the forms to reset or change passwords and in the createsuperuser and changepassword management commands. Validators aren’t applied at the model level, for example in User.objects.create_user() and create_superuser(), because we assume that developers, not users, interact with Django at that level and also because model validation doesn’t automatically run as part of creating models.

ولكن في تطبيق Django الخاص بي ، أستخدم فقط واجهة Django Admin مع admin.ModelAdmin .
عندما أحاول إنشاء مستخدم جديد يمكنني كسر جميع المدققين من AUTH_PASSWORD_VALIDATORS .
كيف يمكنني التحقق من صحة كلمات المرور عند إنشاء مستخدمين جدد في واجهة إدارة Django باستخدام أدوات التحقق AUTH_PASSWORD_VALIDATORS ؟؟؟

admin.py:

class UserCreateForm(ModelForm):
class Meta:
    model = User
    fields = ['username', 'password']


class UserAdmin(admin.ModelAdmin):
    form = UserCreateForm
    list_display = ('username')

    def get_form(self, request, obj=None, change=False, **kwargs):
        if change:
            return self.change_form
        return super(UserAdmin, self).get_form(request, obj, **kwargs)

    def has_add_permission(self, request):
        return True

    def has_delete_permission(self, request, obj=None):
        return False

    def has_change_permission(self, request, obj=None):
        return True

    def save_model(self, request, obj, form, change):
        if obj.pk:
            orig_obj = User.objects.get(pk=obj.pk)
            if obj.password != orig_obj.password:
                obj.set_password(obj.password)
        else:
            obj.is_superuser = True
            obj.set_password(obj.password)
        obj.save()

models.py:

class User(AbstractBaseUser, PermissionsMixin):
    USERNAME_FIELD = 'username'
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        max_length=150,
        unique=True,
        validators=[username_validator]
        )

    objects = UserManager()

manager.py:

class UserManager(BaseUserManager):
    def create_user(self, username, password=None):
        if not username:
            raise ValueError('Users must have username assigned')
        user = self.model(username=username)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password=None):
        user = self.create_user(username, password=password)
        user.is_superuser = True
        user.save(using=self._db)
        return user

settings.py:

AUTH_USER_MODEL = 'users.User'
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    }

2 الاجابة

1
افضل جواب

UPD من مؤلف السؤال:
لكل شخص لديه نفس المشكلة: تحتاج إلى إضافة هذه الوظيفة UserCreateForm :

def clean(self):
    password = self.cleaned_data.get('password')
    if password:
        try:
            password_validation.validate_password(password, self.instance)
        except forms.ValidationError as error:
            self.add_error('password', error)
:مؤلف
1
افضل جواب

المستندات التي ربطتها لتقول:

By default, validators are used in the forms to reset or change passwords

على سبيل المثال ، UserAdmin يستخدم UserCreationForm ، الذي يتحقق من صحة كلمات المرور.

لديك خاصتك UserAdmin و UserCreateForm ، لذلك لن يتم التحقق من صحة كلمات المرور ما لم تقم بإضافة هذه الوظيفة.

فكر جيدًا في ما إذا كنت تحتاج حقًا إلى الإلغاء AbstractBaseUser . إذا تجاوزت AbstractUser بدلاً من ذلك ، سيكون من الأسهل استخدام / توسيع مدراء النماذج / النماذج المضمنة ، ولن تضطر إلى تنفيذ التحقق من صحة كلمة المرور بنفسك.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام