Django не проверяет подлинность пользователей, созданных с помощью shell
В моем проекте есть существующая унаследованная база данных, поэтому я использую inspectdb для создания моделей и для конкретных требований я использую пользовательскую модель пользователя
Нет, когда я создаю пользователя непосредственно в БД с помощью команд SQL, то пользователь проходит аутентификацию и может войти в систему, но когда я создаю пользователя с помощью команд SHELL (model_name.objects.create()), то пользователь не проходит аутентификацию и не может войти в систему.
И главное, ** когда я создаю пользователя с помощью SQL команды пароль хранится в RAW форме (не зашифрован), но когда я создаю пользователя с помощью SHELL команды пароль зашифрован и выглядит как
"pbkdf2_sha256---------------------------------"
managers.py
#managers.py
class UsermanagementCustomUserManager(BaseUserManager):
def create_user(self,emailid,firstname, password=None):
"""
Creates and saves a User with the given email, date of
birth and password.
"""
if not emailid:
raise ValueError('Users must have an email address')
user = self.model(
emailid=self.normalize_email(emailid),
password=password,
)
user.set_password(password)
user.save(using=self._db)
return user
backends.py
#backends.py
from django.contrib.auth.backends import BaseBackend
from django.contrib.auth.hashers import make_password,check_password
from django.contrib.auth import get_user_model
Usermanagement = get_user_model()
class EmailAuthBackend(BaseBackend):
def authenticate(self,request,username=None,password=None):
# print("Custom authenticate rqst: ",request)
try:
print("Trying the email backend!")
user = Usermanagement.objects.get(emailid=username)
print("Got the user")
# print(password)
# print(user.password)
# print(check_password(password))
# print(user.check_password(password))
if user.password == password or user.check_password(password):
return user
except user.DoesNotExist:
return None
def get_user(self,user_id):
try:
print("Getting the user of the Email Bkacned")
return Usermanagement.objects.get(pk=user_id)
except Usermanagement.DoesNotExist:
return None
views.py
#views.py
from django.contrib.auth import login,logout ,authenticate
from django.contrib.auth.forms import AuthenticationForm
def loginPage(request):
# POST
if request.method == 'POST':
form = AuthenticationForm(request,data=request.POST)
if form.is_valid():
email = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
#Check
print("EMAIL: ",email)
print("PASSWORD: ",password)
# Authentication USER
user = authenticate(request,username=email,password=password)
print("Authenticated ",user) # Check
# check
print(user)
if user is not None:
if user.is_active:
login(request,user,backend='accounts.backends.EmailAuthBackend')
# messages.info(request, f"You are now logged in as {email}.")
return redirect("home")
else:
pass
else: # If User Not found
# messages.error(request,"User not found")
# return HttpResponse("User not found, not able to login")
pass
else: # Form InValid
# messages.error(request,"Invalid username or password.")
# return HttpResponse("Form Invalid")
context = {
"form" : form
}
return render(request,"loginPage.html",context=context)
# GET
else:
form = AuthenticationForm()
context = {"form":form}
return render(request,"loginPage.html",context=context)
Способ аутентификации пользователя - прямое использование
user.password == password