You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django与DRF用户注册密码未哈希问题求助

问题原因

API注册用户时密码明文存储,是因为RegisterSerializer的create方法直接调用User.objects.create(**validated_data)创建用户,该操作不会触发密码哈希逻辑;而命令行创建超级用户时,调用的是UserManager的create_superuser,其内部会调用create_user方法,其中包含user.set_password(password)来完成密码哈希。

解决方法

修改serializers.py中RegisterSerializer的create方法,改用User.objects.create_user来创建用户,让自定义的Manager处理密码哈希:

class RegisterSerializer(serializers.ModelSerializer):
    email = serializers.CharField(max_length=255)
    password = serializers.CharField(min_length=8, write_only=True)
    first_name = serializers.CharField(max_length=255)
    last_name = serializers.CharField(max_length=255)
    role = serializers.CharField(max_length=255)
    department = serializers.CharField(max_length=255)

    class Meta:
        model = User
        fields = ["email", "password", "first_name", "last_name", "role", "department"]

    def create(self, validated_data):
        # 单独取出密码参数,剩余字段作为额外参数传递
        password = validated_data.pop('password')
        # 调用Manager的create_user方法,自动处理密码哈希和邮箱规范化
        return User.objects.create_user(password=password, **validated_data)

    def validate_email(self, value):
        if User.objects.filter(email=value).exists():
            raise serializers.ValidationError("This email already exists!")
        return value
补充说明
  • create_user方法会自动执行set_password完成密码哈希,同时会对邮箱进行规范化处理(转小写),和命令行创建用户的逻辑保持一致。
  • 单独取出password是因为create_user需要将密码作为单独参数传入,剩余字段通过**validated_data批量传递。

内容的提问来源于stack exchange,提问作者se7en

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:25:38