【问题标题】:Why is Django authentication is now working for AbstractUser为什么 Django 身份验证现在适用于 AbstractUser
【发布时间】:2021-01-02 04:49:40
【问题描述】:

所以我在 users 应用程序中有这些 Django 模型,并且我已将 AUTH_USER_MODEL = 'users.User' 添加到 settings.py

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    login_count = models.PositiveIntegerField(default=0)

class Supplier(User):
    company_name= models.CharField(max_length=30)
    company_domain=models.CharField(max_length=30)
        
    class Meta:
        verbose_name = 'supplier'
        verbose_name_plural = 'suppliers'
        
class Worker(User):
    ACCOUNT_TYPE = (
        ('1', 'Admin'),
        ('2', 'Regular'),
    )
    is_hub_manager = models.BooleanField(default=False)
    account_type = models.CharField(max_length=1, choices=ACCOUNT_TYPE)
    class Meta:
        verbose_name = 'worker'
        verbose_name_plural = 'workers'

我还使用 Django rest 框架创建了一个身份验证端点。令人惊讶的是,当我对管理员进行身份验证时,一切正常。当我创建供应商并尝试对其进行身份验证时。他们总是返回无效的凭据。这是我的 API 视图

from rest_framework.generics import GenericAPIView
from .serializers import UserSerializer
from rest_framework.response import Response
from rest_framework import status
from django.conf import settings
from django.contrib import auth
import jwt

class LoginView(GenericAPIView):
    serializer_class = UserSerializer

    def post(self, request):
        data = request.data
        username = data.get('username', '')
        password = data.get('password', '')
        user = auth.authenticate(username=username, password=password)
        if user:
            auth_token = jwt.encode({'username': user.username}, settings.JWT_SECRET_KEY)
            serializer = UserSerializer(user)
            data = {'user': serializer.data, 'token': auth_token}
            return Response(data, status=status.HTTP_200_OK)

            # SEND RES
        return Response({'detail': 'Invalid credentials'}, status=status.HTTP_401_UNAUTHORIZED)

我做错了什么?

【问题讨论】:

    标签: python django django-rest-framework django-authentication


    【解决方案1】:

    首先,你应该检查设置文件中的AUTH_USER_MODEL关键字。 例如。 AUTH_USER_MODEL = '<module>. User'.

    关于您的情况,根本原因还不是您的后端中的 custom your authenticate() 方法。您定义了继承自 User 类的 Supplier 和 Worker。

    另外,您可以参考this link了解详情。

    【讨论】:

      猜你喜欢
      • 2022-12-15
      • 2021-08-21
      • 2021-08-23
      • 2014-08-16
      • 2012-08-19
      • 1970-01-01
      • 2019-06-24
      • 2016-08-04
      • 1970-01-01
      相关资源
      最近更新 更多