DRF视图创建用户无法通过SimpleJWT及Django Admin认证问题
问题根源:密码被双重哈希处理了
我仔细看了你的代码,发现核心问题在于密码被进行了两次哈希操作,导致数据库中存储的密码和用户输入的密码无法匹配,这就是为什么用API创建的用户无法通过认证,而python manage.py createsuperuser创建的用户可以正常登录的原因。
具体来说:
- 在你的
MyUserSerializer的create方法中,你先用make_password(validated_data['password'])对原始密码做了哈希处理; - 然后把这个已经哈希过的字符串传给了
MyUserManager.create_user方法; - 但在
create_user里,你又调用了user.set_password(password)——而set_password方法本身会自动对传入的参数进行哈希处理。
这就导致原本已经哈希过的密码被再次哈希,最终存储到数据库里的密码和用户实际输入的密码完全不匹配,自然无法通过认证验证。
解决方案:移除重复的哈希操作
你只需要去掉序列化器中多余的make_password调用,让用户管理器的create_user方法来处理密码哈希即可,这也是Django用户管理器的职责所在。
修改后的序列化器代码:
class MyUserSerializer(serializers.ModelSerializer): username = serializers.CharField( required=True, validators=[UniqueValidator(queryset=MyUser.objects.all())], min_length=5, max_length=20 ) password = serializers.CharField( required=True, max_length=256 ) class Meta: model = MyUser fields = ('username', 'password') def create(self, validated_data): # 直接传递原始密码给create_user,由管理器负责哈希处理 user = MyUser.objects.create_user(validated_data['username'], validated_data['password']) return user
验证其他配置(确保无其他隐患)
顺便检查了你的自定义用户模型和管理器,其他配置都是正确的:
- 已经正确设置
USERNAME_FIELD = 'username',Django认证系统会用这个字段作为登录标识; is_active、is_staff、is_superuser字段默认或在创建时被设为True,满足登录Admin和认证的要求;createsuperuser创建的用户正常,是因为该命令直接传递原始密码给create_user,只进行了一次正确的哈希处理。
修改后重新用API创建用户,应该就能正常通过SimpleJWT认证和Admin登录了。
内容的提问来源于stack exchange,提问作者Tiago Peres
相关产品推荐
相关产品推荐

