Понимание 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 списка.

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