При использовании стандартного модуля аутентификации в django, неудачная аутентификация пользователя неоднозначна. А именно, кажется, нет никакого способа отличить следующие 2 сценария:
- Имя пользователя действительное, пароль недействительный
- Неверное имя пользователя
Я думаю, что я хотел бы отображать соответствующие сообщения пользователю в этих 2 случаях, а не одно "имя пользователя или пароль были недействительными ...".
Каждый имеет опыт работы с простыми способами сделать это. Суть дела, кажется, идет прямо к самому низкому уровню - в классе django.contrib.auth.backends.ModelBackend. Метод authenticate () этого класса, который принимает имя пользователя и пароль в качестве аргументов, просто возвращает объект User, если аутентификация прошла успешно, или None, если аутентификация не удалась. Учитывая, что этот код находится на самом низком уровне (ну, на самом низком уровне, который выше кода базы данных), в обход этого, похоже, выбрасывается много кода.
Является ли лучший способ просто внедрить новый бэкэнд аутентификации и добавить его в настройку AUTHENTICATION_BACKENDS? Можно реализовать серверную часть, которая возвращает кортеж (User, Bool), где объект User имеет значение только None, если имя пользователя не существует, а Bool имеет значение True, только если пароль был правильным. Это, однако, нарушило бы контракт, который бэкэнд имеет с методом django.contrib.auth.authenticate () (который задокументирован для возврата объекта User при успешной аутентификации и None в противном случае).
Может быть, это все из-за беспокойства? Независимо от того, было ли неправильное имя пользователя или пароль, пользователю, вероятно, придется в любом случае перейти на страницу «Потерянный пароль», так что, возможно, все это академично. Я просто не могу не чувствовать, хотя ...
EDIT:
Комментарий относительно ответа, который я выбрал:
Ответ, который я выбрал, - это способ реализации этой функции. Ниже приведен еще один ответ, в котором обсуждаются возможные последствия этого для безопасности, который я также рассматривал как назначенный ответ. Тем не менее, указанный мной ответ объясняет , как может быть реализована. Ответ, основанный на безопасности, обсуждает, должен ли реализовать эту функцию, что на самом деле является другим вопросом.