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
相关产品推荐
相关产品推荐

