Создание кастомной авторизаци
Джанго позволяет выполнять аутентификацию в различных источниках. Параметр AUTHENTICATION_BACKENDS включает список программ аутентификации для проекта. По умолчанию для этого параметра задано следующее:
('django.contrib.auth.backends.ModelBackend',)
По умолчанию ModelBackend аутентифицирует пользователей в базе данных с помощью модели django.contrib.auth. Такая система будет соответствовать большинству проектов. Однако для аутентификации пользователя в других источниках, таких как каталог LDAP или любая другая система, можно создать кастомные настройки авторизации пользователей. Больше информации здесь:
https://docs.djangoproject.com/en/1.8/topics/auth/customizing/\#other-authentication-sources
При использовании функции authenticate() из django.contrib.auth, Джанго попытается выполнить аутентификацию пользователя по отношению к каждой настроке, определенной в AUTHENTICATION_BACKENDS, до тех пор, пока одна из них не будет успешно аутентифицировать пользователя. Только в том случае, если не удается аутентифицировать пользователя, он не будет проходить фвторизацию на сайте.
Джанго предоставляет простой способ определения собственных настроек аутентификации. Серверная часть аутентификации — это класс, предоставляющий следующие два метода:
- authenticate() : Принимает учетные данные пользователя в качестве параметров. Возвращает значение True, если пользователь успешно авторизовался, и False в противном случае
- get_user() : Принимает ID пользователя и возвращает объект User
Создание кастомной авторизации так же просто, как написание класса Python, реализующего оба метода. Мы собираемся создать такую аутентификацию, чтобы позволить пользователям авторизовываться нашем сайте, используя свой адрес электронной почты вместо username.
Создайте новый файл в каталоге приложения account и назовите его authentication.py. Добавьте в него следующий код:
from django.contrib.auth.models import User
class EmailAuthBackend(object):
"""
Authenticate using e-mail account.
"""
def authenticate(self, username=None, password=None):
try:
user = User.objects.get(email=username)
if user.check_password(password):
return user
return None
except User.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
Это простая Серверная часть аутентификации. Метод authenticate() получает необязательные параметры username и password. Мы могли бы использовать различные параметры, но мы используем username и password для того, чтобы наша Серверная часть работала с представлением платформы аутентификации немедленно. Предыдущий код работает следующим образом:
- authenticate() : Мы пытаемся извлечь пользователя с заданным адресом электронной почты и проверить пароль с помощью встроенного метода check_password() кастомной модели. Этот метод обрабатывает хэширование паролей сравнивая заданный пароль с паролем, хранящимся в базе данных.
- get_user() : Мы получим пользователя по ID, установленному в параметре user_id. Джанго использует серверную часть, которая аутентифицирует пользователя для извлечения объекта User в течении пользовательской сессии.
Откройте файл settings.py и добавьте в него следующие настройки:
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'account.authentication.EmailAuthBackend',
)
Мы используем ModelBackend по умолчанию, который используется для аутентификации с помощью имени пользователя и пароля, и включает в себя собственную серверную часть паутентификации через электронную почту. Теперь откройте http://127.0.0.1:8000/account/login/ в браузере. Помните, что Джанго попытается аутентифицировать полльзователя, поэтому теперь вы должны иметь возможность беспрепятственно входить в систему с использованием имени пользователя или электронной почты.
Порядок настроек, перечисленных в AUTHENTICATION_BACKENDS , имеет значение. Если одинаковые учетные данные действительны для нескольких настроек, Джанго остановится на первой, которая успешно аутентифицирует пользователя.