【问题标题】:djangorestframework-simplejwt getting "No active account found with the given credentials" although I know my user existsdjangorestframework-simplejwt 得到“没有找到具有给定凭据的活动帐户”虽然我知道我的用户存在
【发布时间】:2021-04-04 02:13:19
【问题描述】:

我对 Django 还很陌生,我觉得我一定遗漏了一些东西。我有一个需要两种用户类型(UserType1 和 UserType2)的应用程序。我正在使用带有布尔标志的基本用户模型,然后在这些对象上为用户创建 OneToOne 字段(此时没有添加额外数据)。

这给了我以下用户模型:

from django.conf import settings
from django.contrib.auth.models import AbstractUser, UserManager
from django.core.exceptions import ValidationError
from django.db import models
from django_extensions.db.models import TimeStampedModel


class User(AbstractUser):
    """
    Default user model for the platform
    """
    email = models.EmailField()
    is_user_type_1 = models.BooleanField(default=False)
    is_user_type_2 = models.BooleanField(default=False)

    # Use default UserManager for now
    objects = UserManager()


class UserType1(TimeStampedModel):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        primary_key=True,
        related_name='user_type1',
    )


class UserType2(TimeStampedModel):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        primary_key=True,
        related_name='user_type2'
    )

然后我为这些类编写了序列化,我只想公开UserType1UserType2(而不是User 本身)的端点。这应该允许用户创建UserType1UserType2 的实例,这也将在User 表中创建行(尽管对此可能不是很重要)。以下是序列化程序:

from django.db import transaction
from rest_framework import serializers

from .models import User, UserType1, UserType2


class UserSerializer(serializers.ModelSerializer):
    """
    Serializer for the `User` model
    """

    class Meta:
        model = User
        fields = (
            'username',
            'email',
            'password',
            'first_name',
            'last_name',
            'is_active',
        )
        extra_kwargs = {'password': {'write_only': True}}


class UserType1Serializer(serializers.ModelSerializer):
    user = UserSerializer(required=True)

    class Meta:
        model = UserType1
        fields = (
            'user',
            'created',
            'modified',
        )

    @transaction.atomic
    def create(self, validated_data):
        user_data = validated_data.pop('user')
        user_data.is_user_type_1 = True
        user_data.is_user_type_2 = False
        user = UserSerializer.create(UserSerializer(), validated_data=user_data)

        user_type_1, created = UserType1.objects.update_or_create(
            user=user,
        )

        return user_type_1

class UserType2Serializer(serializers.ModelSerializer):
    user = UserSerializer(required=True)

    class Meta:
        model = UserType2
        fields = (
            'user',
            'created',
            'modified',
        )

    @transaction.atomic
    def create(self, validated_data):
        user_data = validated_data.pop('user')
        user_data.is_user_type_1 = False
        user_data.is_user_type_2 = True
        user = UserSerializer.create(UserSerializer(), validated_data=user_data)

        user_type2, created = UserType2.objects.update_or_create(
            user=user,
        )

        return user_type2

User 模型已在我的设置中注册:

AUTH_USER_MODEL = 'user.User'

创建超级用户后,我可以成功获取我的令牌并使用它们访问其他视图:

{
    "refresh": "xxxx",
    "access": "xxxx"
}

但是,如果我从管理员创建一个用户(或者我有创建用户和 user_type1/user_type2 对象的装置),每次我尝试获取我得到的令牌时:

{
    "detail": "No active account found with the given credentials"
}

但我知道它们存在于数据库中,因为我可以在管理控制台中正确地看到它们。我认为这与密码散列有关,但无法解决。

这还包含以下admin.py 文件:

from django.contrib import admin

from .models import User, UserType1, UserType2

admin.site.register(User)
admin.site.register(UserType1)
admin.site.register(UserType2)

任何帮助将不胜感激!

【问题讨论】:

  • 你能显示注册自定义用户模型的 admin.py 文件吗?我猜密码没有被散列,而是纯文本。
  • 是的对不起,刚刚编辑添加到上面

标签: django-rest-framework django-rest-framework-simplejwt


【解决方案1】:

在管理员中注册您的自定义用户模型:

from django.contrib.auth.admin import UserAdmin

admin.site.register(models.User, UserAdmin)

或者按照有关如何在管理员中注册自定义用户模型的文档。 A full example

通过管理面板创建一个新用户并检查密码是否经过哈希处理。 然后再次对您的 jwt 端点进行 api 调用。

【讨论】:

  • 太棒了,谢谢!花了一些时间玩弄数据来播种,但这解决了它并且是一个巨大的帮助:) 标记为已接受并尝试投票,但我的声誉太低了
猜你喜欢
  • 1970-01-01
  • 2019-09-03
  • 2019-09-18
  • 2020-03-05
  • 2022-08-04
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多