Понимание AUTHENTICATION_BACKENDS
Я пытаюсь понять, как все работает, когда человек пишет следующее в settings.py
:
AUTHENTICATION_BACKENDS = (
"django.contrib.auth.backends.ModelBackend",
"allauth.account.auth_backends.AuthenticationBackend",
"master_password.auth.ModelBackend"
)
В частности, в документации говорится:
Если бэкенд вызывает исключение
PermissionDenied
, аутентификация немедленно завершится неудачей. Django не будет проверять последующие бэкенды.
Учитывая это, как второй и третий бэкенд в приведенном выше примере могут получить шанс, если пользователь ввел неправильный пароль, а первый бэкенд отказал ему в доступе? Более конкретно, третий бэкенд относится к django-master-password, который должен впустить пользователя, если он использовал мастер-пароль, даже если он не совпадает с паролем пользователя. Итак, как же этот бэкенд получит шанс?
От docs
:
Django пытается пройти аутентификацию через все свои бэкенды аутентификации. Если первый метод аутентификации не работает, Django пробует второй, и так далее, пока не будут испробованы все бэкенды.
.
django.contrib.auth.backends.ModelBackend
(если я правильно помню) не поднимает PermissionDenied
, поэтому если аутентификация на нем не прошла, будут использоваться последующие бэкенды аутентификации, пока не будет найдено совпадение.
Порядок AUTHENTICATION_BACKENDS имеет значение, поэтому если одно и то же имя пользователя и пароль действительны в нескольких бэкендах, Django остановит обработку на первом положительном совпадении.
Если вы обнаружите, что это вызывает PermissionDenied
, тогда эту модель бэкенда, вероятно, лучше разместить в конце вашего AUTHENTICATION_BACKENDS
списка.