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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:02:33