Django - Аутентификация с использованием только пароля

Мне нужно реализовать аутентификацию с использованием только пароля.

Я знаю, что по соображениям безопасности это не рекомендуется, но мне нужен такой подход, поскольку вход в систему осуществляется только с помощью RFID-кодов. Я мог бы рассматривать этот код как обычное поле (не пароль) и просто получить пользователя с этим кодом, но я хочу хэшировать это значение, поэтому я перебираю всех пользователей с помощью check_password.

[models.py]

class CustomUserManager(BaseUserManager):
    def create_user(self, password=None, **extra_fields):
        user = self.model(**extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')
        
        return self.create_user(**extra_fields)

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, null=True)
    username = models.CharField(max_length=40, unique=True)
    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=40)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)

    objects = CustomUserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.username
    
    @property
    def full_name(self):
        return f'{self.first_name} {self.last_name}'

[views.py]

def login_view(request):
    if request.user.is_authenticated:
        return redirect(reverse('home'))
    
    if request.method == 'POST':
        password = request.POST.get('rfid_code')
        user = authenticate(request, password=password)
        if user is not None:
            login(request, user)
            return redirect(settings.LOGIN_REDIRECT_URL)
    
    return render(request, 'account/login.html')

[backend.py]

class CustomAuthenticationBackend(BaseBackend):

    def authenticate(self, request, password=None):
        try:
            User = get_user_model()
            for user in User.objects.all():
                # this method returns False even if the password is correct
                if user.check_password(password): 
                    return user
                else:
                    raise User.DoesNotExist('User does not exist')

        except CustomUser.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return CustomUser.objects.get(pk=user_id)
        except CustomUser.DoesNotExist:
            return None

Почему не работает аутентификация?

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