关于继承djangon内置模型AbstractUser用户认证authenticate一直返回None

为了想要使用django内置的auth_user表字段,但是有些字段没有,想要定制于是我们可以:

首先导入:

from django.contrib.auth.models import User, AbstractUser
from django.db import models
然后这么写:
class UserInfo(AbstractUser):
    """
    用户信息
    """
    nid = models.AutoField(primary_key=True)
    telephone = models.CharField(max_length=11, null=True, unique=True)

    def __str__(self):
        return self.username

然后你会发现:

这是djang的认证模块

导入:

from django.contrib import auth
user = auth.authenticate(request,username=user_name, password=pwd)
这么写你会发现一直返回None,因为使用自定用户模型,也就是你自己创的表
当你创建自定义用户模型的时候,并且设置了AUTH_USER_MODEL的时候,django不会提供默认User模型,也就不会创建对应的数据库表,由于连表都没有创建所以这时候使用django的authenticate一直会返回空None,由于此时不再是django中内置模型User,那么必须使用自定义后端认知处理
解决方法:
在你的应用下面创建这么一个文件,backends.py
#自定义后端认证组件
from django.contrib.auth.backends import BaseBackend
from blogProject.models import UserInfo

class CustomAuthBackend(BaseBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = UserInfo.objects.get(username=username)
            if user.check_password(password):
                return user
        except UserInfo.DoesNotExist:
            return None

  那么django就会使用你自定义认证了,最后一部还需设置

在你的项目的 settings.py 文件中,指定使用自定义的认证后端来处理用户认证请求。

加上:

AUTHENTICATION_BACKENDS = [
'yourapp.backends.CustomAuthBackend',
# 其他认证后端...
]

posted @ 2024-06-08 18:59  GOZO  阅读(57)  评论(0)    收藏  举报