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
Почему не работает аутентификация?