Вы говорите: «Я не хочу писать пользовательский бэкэнд аутентификации», но пользовательский бэкэнд аутентификации - это именно тот способ, которым Django ожидает, что вы решите эту проблему, и, кроме того, это действительно довольно просто - гораздо проще, чем установка стороннего приложения.
Вот простой подход, при котором пользователь имеет один адрес электронной почты, хранящийся в поле email
встроенного объекта User
.
Сначала подумайте о чувствительности к регистру. Даже если локальная часть адреса электронной почты (часть перед знаком @) может быть чувствительна к регистру (в зависимости от поставщика электронной почты), встроенное приложение Django auth
обрабатывает адреса электронной почты как регистр - нечувствителен (например, при принятии решения, каким пользователям отправлять электронные письма в ответ на запрос сброса пароля). Так что, вероятно, вам лучше относиться к ним так же.
Во-вторых, убедитесь, что два пользователя не могут использовать один и тот же адрес электронной почты. Вы можете сделать это вручную в базе данных:
ALTER TABLE auth_user ADD UNIQUE INDEX (email);
или, если вы используете Юг , выполните миграцию схемы для приложения auth
, в которое вы звоните db.create_unique('auth_user', 'email')
.
Чтобы обеспечить уникальность без учета регистра, вы должны убедиться, что сопоставление в поле email
не учитывает регистр. Я обнаружил, что это уже было, но вы можете сделать что-то вроде:
ALTER TABLE auth_user MODIFY email VARCHAR(75) COLLATE utf8_general_ci;
(или ascii_general_ci
, если вы не поддерживаете международные адреса электронной почты .)
В-третьих, определите ваш бэкэнд аутентификации , возможно, в mysite/backends.py
:
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
class EmailAuthenticationBackend(ModelBackend):
"""
Authenticate against django.contrib.auth.models.User using
e-mail address instead of username.
"""
def authenticate(self, username=None, password=None):
try:
user = User.objects.get(email__iexact = username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
В-четвертых, добавьте свой бэкэнд аутентификации в settings.py
:
AUTHENTICATION_BACKENDS = ('mysite.backends.EmailAuthenticationBackend',)