Django аутентификация пользователя вход
Я столкнулся с проблемой аутентификации пользователей в моем проекте Django. У меня есть пользовательская модель пользователя для врачей Doctor
, которая наследуется от AbstractUser
. Несмотря на ввод правильного email и пароля при входе в систему, система выдает ошибку "Неверный пароль".
base/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser, Group, Permission
class Doctor(AbstractUser):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=50)
name = models.CharField(max_length=50)
profession = models.CharField(max_length=50, default='Doctor')
email = models.EmailField(max_length=254, unique=True)
emp_code = models.CharField(max_length=50)
password = models.TextField(max_length=150)
USERNAME_FIELD = 'email'
groups = models.ManyToManyField(
Group,
blank=True,
related_name='doctor_group'
)
user_permissions = models.ManyToManyField(
Permission,
blank=True,
related_name='doctor_user_permission'
)
def __str__(self):
return self.username
base/views.py
def docter_login(request):
if request.method == 'POST':
email = request.POST.get('email').lower()
password = request.POST.get('password')
print(email,password)
# Authenticate the user using the email and password provided in the form
if not Doctor.objects.filter(email__iexact=email).exists():
messages.error(request, 'User with that email Does not exists.')
return render(request, 'base/error.html')
user = authenticate(request, email=email, password=password)
if user is not None and user.is_doctor:
login(request, user)
return redirect('home')
else:
messages.error(request,'Invalid password.')
return render(request, 'base/error.html')
return render(request, 'base/doctor_login.html')
пользователь существует и передает правильные учетные данные для аутентификации, он все равно возвращает "Invalid password". Что может быть причиной этой проблемы? `
Не будет работать authenticate
, так как по умолчанию он идентифицирует пользователя с помощью username
, а также не выполняет __iexact
поиск.
Мы можем написать собственный бэкенд аутентификации [Django-doc] для работы с электронной почтой:
# app_name/authentication.py
from django.contrib.auth.backends import BaseBackend
class EmailAuthenticationBackend(BaseBackend):
def authenticate(self, request, email=None, password=None):
try:
user = Doctor.objects.get(email__iexact=email, is_active=True)
except User.DoesNotExist:
return None
if user.check_password(password):
return user
return None
и добавьте это в настройки AUTHENTICATION_BACKENDS
[Django-doc]:
# settings.py
# …
AUTHENTICATION_BACKENDS = ['app_name.authentication.EmailAuthenticationBackend']
Обратите внимание, что при регистрации пользователей следует использовать Doctor.objects.create_user(…)
. Я бы также не говорил, что нет пользователя с таким именем, поскольку тогда люди могут догадаться, зарегистрирован ли определенный адрес электронной почты в качестве пользователя: просто выдавая ошибку, что комбинация имя пользователя/пароль не действительна, вы тем самым не раскрываете информацию о том, на какие адреса электронной почты зарегистрированы пользователи, а на какие нет.