【问题标题】:password isn't hashed on custom user model using rest api密码未使用 rest api 在自定义用户模型上进行散列
【发布时间】:2020-05-21 01:03:24
【问题描述】:

我试图创建一个自定义用户模型并创建一个 rest-api,但是当我发送发布请求时,它会创建一个用户模型,但密码没有经过哈希处理我在 user_create 方法中使用设置密码,它适用于基于命令行的超级用户,但是当我使用由 api 创建的其他用户时,我没有使用设置密码方法,但它也不起作用 这是我的用户模型

class UserProfile(AbstractBaseUser, PermissionsMixin):
    """custom user model"""
    email = models.EmailField(max_length=250, unique=True)
    name = models.CharField(max_length=250)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    # django required and django user field declaration
    USERNAME_FIELD = 'email'
    objects = UserProfileManager()
    REQUIRED_FIELDS = ['name']

    def __str__(self):
        return self.email

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

我的个人资料管理员

class UserProfileManager(BaseUserManager):
    """User manager for our custom user model"""

    def create_user(self, name, email, password=None):
        if not email:
            raise ValueError('User Must have an email')
        email = self.normalize_email(email)
        user = self.model(name=name, email=email)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, name, email, password=None):
        user = self.create_user(
            name=name,
            email=email,
            password=password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)

我的序列化器

class UserProfileSerializer(serializers.ModelSerializer):
    """Serializes our custom django user model UwU (nice serializer desu ka)"""


    class Meta:
        model = models.UserProfile
        fields = ('id','name','email','password')
        extra_kwargs = {
            'password':{
                'write_only':True,
                'style':{
                    'input_type':'password'
                }
                }
            }
        def create(self, validated_data):
                """ Create and return a new user"""
                user = models.UserProfile.objects.create_user(
                    email=validated_data['email'],
                    name=validated_data['name']
                )
                user.set_password(validated_data['password'])
                user.save()
                return user

我的观点集

class ProfileViewSet(ModelViewSet):
    """View set for user profile"""
    serializer_class = serializer.UserProfileSerializer
    queryset = models.UserProfile.objects.all()
    authentication_classes = (TokenAuthentication,)

我是 django rest-framework 的新手,所以请帮助我

【问题讨论】:

  • 使用 set_password() 保存密码(在 create() 中),否则它会将密码保存为简单文本。这就是错误。
  • 检查您是否在设置中声明了AUTH_USER_MODEL = 'yourapp.UserProfile'
  • @JacekBBudzynski 我做到了

标签: django django-models django-rest-framework django-templates django-views


【解决方案1】:

你不需要像你已经在 seiralizer 中明确地做set_password 有一个create_usermanager method。所以试试这样:

class UserProfileSerializer(serializers.ModelSerializer):

   class Meta:
        model = models.UserProfile
        fields = ('id','name','email','password')
        extra_kwargs = {
            'password':{
                'write_only':True,
                'style':{
                    'input_type':'password'
                }
             }
         }

    def create(self, validated_data):
        user = models.UserProfile.objects.create_user(
                    email=validated_data['email'],
                    name=validated_data['name'],
                    password = validated_data['password']
               )
        return user

【讨论】:

  • 我这样做了,但仍然没有
  • @FaizUlHassan 你能像更新的答案一样修复缩进吗?
【解决方案2】:

我也遇到了同样的问题 我的 '''create_user''' 需要 3 个参数,如下所示

create_user(self, email, password, **extra_fields)

所以当我在我的register() 视图中调用它时,我是这样做的:

from .models import CustomUserModel

register(request):
   # assuming you are using model form
   form = RegistraionForm()
   if request.method == 'POST':
      form = RegistraionForm(request.POST)
      if form.is_valid():
         # fetch your fields 
         email = form.cleaned_data['email']
         password = form.cleaned_data['password']
         # fetch other fields as well
         user = CustomUserModel.objects.create_user(
            email = email,
            password = password,
            other_field = other_fetched_field`enter code here`
         )
         # no need to use set password here
         return redirect('path')

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 2019-04-12
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2019-10-07
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多