当前位置: 首页 > 面试题库 >

为什么我的Django用户模型的密码没有散列?

聂风史
2023-03-14
问题内容

我正在使用Django REST Framework(DRF)创建一个可以注册新用户的终结点。但是,当我通过POST到达创建端点时,新用户将通过序列化器保存,但密码以明文形式保存在数据库中。我的序列化器的代码如下:

from django.contrib.auth import get_user_model
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = get_user_model()
        fields = ['password', 'username', 'first_name', 'last_name', 'email']
        read_only_fields = ['is_staff', 'is_superuser']
        write_only_fields = ['password']

请注意,我使用的是Django auth包中的默认用户模型,并且对使用DRF来说是一个新手!


问题答案:

问题是DRF只需将字段值设置到模型上即可。因此,密码在“密码”字段中设置,并保存在数据库中。但是要正确设置密码,你需要调用该set_password()方法,该方法将进行哈希处理。

有几种方法可以做到这一点,但是在REST Framework v3上最好的方法是覆盖序列化器上的update()create()方法。

class UserSerializer(serializers.ModelSerializer):
    # <Your other UserSerializer stuff here>

    def create(self, validated_data):
        password = validated_data.pop('password', None)
        instance = self.Meta.model(**validated_data)
        if password is not None:
            instance.set_password(password)
        instance.save()
        return instance

    def update(self, instance, validated_data):
        for attr, value in validated_data.items():
            if attr == 'password':
                instance.set_password(value)
            else:
                setattr(instance, attr, value)
        instance.save()
        return instance

这里有两件事:

  1. 我们使用self.Meta.model,因此,如果在序列化程序上更改了模型,则它仍然可以工作(只要有某种set_password 方法就可以了)。
  2. 我们迭代validated_data项目而不是字段,以说明可选的excludeed字段。
    另外,此版本的create不会保存M2M关系。在你的示例中不需要,但是可以根据需要添加。你将需要从字典中弹出这些文件,保存模型并随后进行设置。

FWIW,因此,我将这个答案中的所有python代码设为全球公共域。它的分发没有任何保证。



 类似资料:
  • 我正在尝试创建一个SQL过程,对密码输入进行散列。这段代码将无法运行,并且我没有得到任何有用的响应错误。 第一部分创建表,第二部分创建过程。当我在第三部分调用我的过程时,它将值发送到过程中。在那里,密码应该使用SHA2_512进行散列,并插入到我们做了eRalier的表中。 我用网上的研究做了这段代码,我没有得到的部分是: 我的值之前的N SetNoCount @ResponseMessage

  • 我试图在我的datacontracts中对我的datamembers密码进行哈希/盐析,但当我添加一个新的学生,然后获取该学生集合时,密码字段尚未进行哈希/盐析,它会返回我键入的内容? 有人能帮我修一下吗?

  • 问题内容: 我正在尝试创建一个模型,在其中可以存储其他应用程序的用户名和密码。如何在Django中设置密码字段,使其在admin中不是纯文本格式?提前致谢。 问题答案: 正如@mlissner所建议的那样,该模型是一个不错的选择。如果你查看源代码,则会看到该d字段是。 该User模型也有一种set_password方法。 你可以从此方法中获得一些有关创建和保存密码的线索。

  • 经过一些故障排除,我确定当我使用PHP的password_hash函数散列密码时,加密标识符是$2y$。但是,当我使用password_verify函数将存储的散列密码与用户输入密码进行比较时,password_verify不会返回true。如果我使用https://www.bcrypt-generator.com/上的$2a$标识符生成一个新密码,并用它替换存储的散列密码,它将返回true。 我

  • 问题内容: 我只是好奇是否有人知道django的orm有什么理由不在模型上调用“full\u clean”,除非它被保存为模型表单的一部分。 请注意,调用模型的save()方法时,不会自动调用full\ u clean()。当您要为自己手动创建的模型运行一步模型验证时,需要手动调用它。django完全干净的医生 (注:Django 1.6的报价已更新。。。以前的django文档也对ModelFor

  • 今天我在家里的电脑上安装了netbean,以便在家做一些工作。我安装了java 8 JDK(151),并安装了包含所有内容的netbean(没有进行自定义安装)。然后我把我的项目从github上撤下来。 我的安装文件夹是在E:\netbean我的项目文件夹是默认的c: 我加载了项目,打开XAMPP并运行它。太好了,很管用。 然后我对HTML进行了更改(修复了我犯的一个拼写错误)。再次运行。找不到零