Пользовательская аутентификация возвращает NULL каждый раз в django

Я новичок в django и хочу построить аутентификацию с использованием пользовательской модели пользователя. Я задал вопрос Здесь. Мне посоветовали наследовать модель пользователя.

Я создал пользовательскую модель пользователя. Поскольку все пароли хранятся с помощью функции bcrypt, я создал свою собственную аутентификацию. Теперь каждый раз, когда я вхожу в систему, я получаю None, даже если мой пароль правильный. Я хочу знать, что я упускаю?

models.py


class AdminUserManager(BaseUserManager):
    def create_user(self, username, password):
        if username is None or password is None:
            raise ValueError("Username and Password is Required")
        else:
            user = self.model(
                username = username,
                password = str(bcrypt.hashpw(password.encode('utf8'),bcrypt.gensalt()),'utf-8')
            )
            user.save(using=self.db)
            return user



class AdminUsers(AbstractBaseUser):
    username=models.CharField(max_length=50,unique=True)
    firstname=models.CharField(max_length=50)
    department=models.CharField(max_length=50)
    mail=models.CharField(max_length=50)
    id=models.IntegerField(primary_key=True)
    password=models.CharField(max_length=200)
    # some more field
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['mail']

    objects = AdminUserManager()
    class Meta:
        db_table="admin_users"

    def __str__(self):
        return self.username

backend.py

from .models import AdminUsers
import bcrypt

class CustomAuthentication(object):
    def authenticate(self,username,password):
        if username is not None and password is not None:
            user = AdminUsers.objects.get(username=username)
            hashed_password = user.password
            is_check = bcrypt.checkpw(password.encode('utf8'),hashed_password.encode('utf8'))
            if is_check == True:
                return user
            else:
                return None
        else:
            return None
    
    def get_user(self,id):
        user = AdminUsers.objects.get(id=id)
        if user is not None:
            return user
        else:
            return None
        

views.py

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username is not None and password is not None:
            is_check = authenticate(username=username,password=password)
            # user=AdminUsers.objects.get(username=username)
            # print(user.username,user.password)
            # hashed_password = user.password
            # is_check = bcrypt.checkpw(password.encode('utf8'),hashed_password.encode('utf8'))
            print(is_check)
            if is_check==True:
                return render(request,'Layouts/nav-side-bar.html',context={"User":is_check})
            else:
                return render(request,'AdminUsers/login.html')
    return render(request,'AdminUsers/login.html')

Я добавил AUTHENTICATION_BACKENDS и AUTH_USER_MODEL в настройках.

*** Редактировать 1 ***

Чтобы проверить, работает ли моя CustomAuthentication или нет, в функции authenticate я закомментировал некоторые части и возвращаю пользователя без проверки пароля. Я все еще получаю None. Насколько я понимаю, моя CustomAuthentication не используется для аутентификации.

def authenticate(self,username,password):
        if username is not None and password is not None:
            user = AdminUsers.objects.get(username=username)
            return user
            # hashed_password = user.password
            # is_check = bcrypt.checkpw(password.encode('utf8'),hashed_password.encode('utf8'))
            # if is_check == True:
            #     return user
            # else:
            #     return None
        else:
            return None

Я допустил ошибку. При создании CustomAuthentication я должен наследовать BaseBackend, как указано в Documentation. Таким образом, backend.py должен выглядеть следующим образом.

from django.db import models
from django.db.models.base import Model
from .models import AdminUsers
import bcrypt
from django.contrib.auth.backends import BaseBackend

class CustomAuthentication(BaseBackend):
    def authenticate(self,request,username=None,password=None):
        if username is not None and password is not None:
            user = AdminUsers.objects.get(username=username)
            hashed_password = user.password
            is_check = bcrypt.checkpw(password.encode('utf8'),hashed_password.encode('utf8'))
            if is_check == True:
                return user
            else:
                return None
        else:
            return None
    
    def get_user(self,user_id):
        user = AdminUsers.objects.get(id=user_id)
        if user is not None:
            return user
        else:
            return None
        


Вернуться на верх