django 在数据库中对密码进行编码吗?

does django encode passwords in the Database?

我用密码 password123 创建了一个用户,但在数据库中,密码字段看起来像这样 pbkdf2_sha2560000$rJZWVrYXlokRG8fGMS1fek$S7Dm9soflUsy0Q74CJP8sB60tgfRWuRPdqj5XL0DBV0=

  1. 那么我应该如何创建新用户才能保持 django 密码编码功能
  2. 还有如何停用此密码编码功能

回复。问题 2.

Django 不存储密码,只存储密码的哈希值,用于用户登录时进行比较。

不可能从这个散列中逆向工程密码(好吧,从数学上讲这是可能的,但你没有 运行 这个过程的资源)。也不应该。

如果您想要一个未经哈希处理的密码字段,您可以只使用一个字符串字段。但是……不要这样做!它非常不安全。

您无需知道用户密码。

至于问题 1,我不确定您为什么没有看到它经过哈希处理 - 您需要 post 一些代码。

您需要在 User Create Serializer 中覆盖 create 方法:

class UserCreateSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        return user

    class Meta:
        model = User 
        fields = "__all__" # or your specific fields  
        extra_kwargs = {
            "password": {"write_only": True},
        }

现在您的用户密码将作为散列密码保存在数据库中。

Django 使用加密中间件来加密密码(因为数据库将密码视为 VarChar 字段,所以 Django 的模型将它们视为纯文本,除非另有说明)。如果想让Django User模型使用加密,必须调用

user_obj.set_password(passwd_text) 

通过这行代码,您告诉 Django 运行 加密算法。例如,在您的情况下,您可以先使用序列化程序的 extra_kwargs 从数据库可读数据中排除密码,然后创建用户。

class CreateUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['email', 'username', 'password']
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        password = validated_data.pop("password")
        user = User(**validated_data)
        user.set_password(password)
        user.save()
        return user 

如果您想了解更多关于 Django 用户和密码的信息,请阅读这些文档 user model docencryption types and password management doc