【问题标题】:How do I hash passwords in DRF?如何在 DRF 中散列密码?
【发布时间】:2020-07-18 18:40:37
【问题描述】:

我对 Django REST Framework 输出的序列化数据有疑问,因为密码字段没有经过哈希处理(尤其是那些直接从 DRF 创建的)。我使用 createsuperuser 命令创建的用户具有序列化密码散列(pbkdf2),这很好,但我使用 DRF 创建的用户不是。 我使用的序列化器是这样的(serializers.py):

from users.models import User

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(style={'input_type': 'password'})
    class Meta:
        model = User
        fields = '__all__'

模型类看起来像这样(models.py):

from django.contrib.auth.models import AbstractUser

# Create your models here.

class User(AbstractUser):
    class Role:
        ADMINISTRATOR = 'Administrator'
        PHARMACIST = 'Pharmacist'
        PATIENT = 'Patient'

        choices = {
            (ADMINISTRATOR, 'Administrator'),
            (PHARMACIST, 'Pharmacist'),
            (PATIENT, 'Patient'),
        }

    role = models.CharField(max_length=100, choices=Role.choices, default=Role.ADMINISTRATOR)
    first_name = models.CharField(max_length=100, blank=False)
    last_name = models.CharField(max_length=100, blank=False)
    email = models.EmailField(max_length=100, unique=True)
    birth_date =  models.DateField(auto_now_add=False, blank=True, null=True)
    address = models.CharField(max_length=255)

查询集看起来像这样(views.py):

from django.shortcuts import render
from users.models import User
from rest_framework import viewsets
from users.serializers import UserSerializer

# Create your views here.


class UserViewSet(viewsets.ModelViewSet):
    serializer_class = UserSerializer
    queryset = User.objects.all()

我期待您的帮助。

【问题讨论】:

  • 你的模型中有密码字段吗?
  • 它从 AbstractUser 类中获取密码字段。

标签: python django django-rest-framework


【解决方案1】:

这件事对我有用:

def create(self, validated_data):
    user = super(UserSerializer, self).create(validated_data)
    user.set_password(validated_data['password'])
    user.save()
    return user

现在,密码被序列化了。

【讨论】:

  • 工作就像一个魅力。谢谢。
【解决方案2】:

您可以覆盖.to_internal_value()。 (这比覆盖create() 的优势在于只保存对象一次。)

不过,这可能会在编辑用户时表现得很奇怪。 YMMV :)

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(style={'input_type': 'password'})

    class Meta:
        model = User
        fields = '__all__'

    def to_internal_value(self, validated_data):
        raw_password = validated_data.pop('password')
        user = super().to_internal_value(validated_data)
        user.set_password(raw_password)  # Hash the raw password
        return user

【讨论】:

  • 试过你的答案,遗憾的是密码输出仍然没有散列。 :(
猜你喜欢
  • 2011-02-08
  • 2016-11-01
  • 2011-05-10
  • 2017-10-08
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多