Пользовательская аутентификация возвращает 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