Django AUTH_PASSWORD_密码验证器在BaseManager类中不起作用

2024-04-25 22:01:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想验证最小长度为9的密码,并在AUTH_password_VALIDATORS中将其指定为:

{
    'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    'OPTIONS': {
        'min_length': 9,
    }
},

我使用Django serializer序列化请求:

class UserSerializer(serializers.ModelSerializer):

    date_joined = serializers.ReadOnlyField()
    user_type = serializers.ListField(child=serializers.CharField(max_length = 20))

    class Meta(object):
        model = User
        fields = ('id', 'email', 'first_name', 'middle_name', 'last_name', 'mobile_num', 'date_joined', 'password','user_type', 'otp_verified')
        id = serializers.CharField(max_length=10)
        email = serializers.EmailField()
        password = serializers.CharField(style={'input_type': 'password'})
        extra_kwargs = {'password': {'write_only': True}}

在这里,我想在BaseManager中检查密码验证,并相应地编码:

class UserManager(BaseUserManager):

    def _create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError('The given email must be set')
        try:
            with transaction.atomic():
                user = self.model(email=email, **extra_fields)
                user.set_password(password)
                user.save(using=self._db)
                return user
        except:
            raise

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_superuser', False)
        if(len(password) < 9):
            raise ValidationError("length too short")
        else:
            return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_superuser', True)

        return self._create_user(email, password=password, **extra_fields)

    def get_default_password_validators(self, password):
        return get_password_validators(settings.AUTH_PASSWORD_VALIDATORS)

now = datetime.datetime.now()

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=40, unique=True)
    first_name = models.CharField(max_length=30, blank=True)
    middle_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(default=now)
    user_type = ArrayField(models.CharField(max_length = 20))
    mobile_num = models.CharField(max_length = 10)
    otp_verified = models.BooleanField(default=False)
    objects = UserManager()
   

在create_user()中,我尝试检查密码的最小长度并进行相应的验证,也尝试使用类MinimumLengthValidator,但验证没有发生。因此使用自定义验证

有人能帮我用这个代码,默认的内置密码验证器吗


Tags: nameselftrue密码fieldsmodelsemailcreate
2条回答

当您像这样创建用户序列化时,DRF将尝试准确地获取它从视图中获得的内容,并将其放入数据库中。您应该使用import django.contrib.auth.password_validation并在validate()方法中执行它。与this question比较

我得到了答案,在serializer类中添加以下内容:

密码验证

def validate_password(self, password):
    
    if not re.findall('\d', password):
        raise serializers.ValidationError("The password must contain at least 1 digit, 0-9.")
    if not re.findall('[A-Z]', password):
        raise serializers.ValidationError("The password must contain at least 1 uppercase letter, A-Z.")
    if not re.findall('[a-z]', password):
        raise serializers.ValidationError("The password must contain at least 1 lowercase letter, a-z.")
    if not re.findall('@#', password):
        raise serializers.ValidationError("The password must contain at least 1 symbol: " + "@ or #")
    return password}

我没有选择BaseManager类,而是尝试了序列化程序本身的代码,它对我来说很好

相关问题 更多 >