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(…). Я бы также не говорил, что нет пользователя с таким именем, поскольку тогда люди могут догадаться, зарегистрирован ли определенный адрес электронной почты в качестве пользователя: просто выдавая ошибку, что комбинация имя пользователя/пароль не действительна, вы тем самым не раскрываете информацию о том, на какие адреса электронной почты зарегистрированы пользователи, а на какие нет.

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