Существует возможность интеграции Django с имеющейся системой аутентификации — с другим источником имён и паролей или методов аутентификации.
Например, ваша компания может уже использовать LDAP, в котором хранятся имена и пароли для каждого сотрудника. Администратору сети и пользователям быстро надоест использовать разные логины для работы с LDAP и Django приложениями.
Для решения этой задачи система аутентификации Django позволяет вам подключить внешние источники аутентификации. Вы можете переопределить схему аутентификации, изначально настроенную на использование базы данных, также вы можете использовать стандартную систему в тандеме с другими системами.
С технической точки зрения, Django поддерживает список источников аутентификации. Когда кто-нибудь вызывает django.contrib.auth.authenticate() (описанный в главе «Сессии, пользователи и регистрация»), Django пытается проверить пользователя, используя все источники аутентификации. Django перебирает каждый источник, пока не найдёт совпавший.
Список источников аутентификации, предназначенных для
использования, определён в параметре
AUTHENTICATION_BACKENDS. Параметр должен
хранить кортеж путей, которые указывают на классы, которые в
свою очередь знают, как выполнять процедуру
аутентификации. Эти классы могут быть где угодно, главное,
чтобы их можно было найти через $PYTHONPATH.
По умолчанию, параметр
AUTHENTICATION_BACKENDS содержит:
('django.contrib.auth.backends.ModelBackend',)
Это простая схема аутентификации, которая проверяет пользователя по базе данных.
Порядок определения источников в параметре
AUTHENTICATION_BACKENDS имеет
значение. Таким образом, если пользователь верно определён в
нескольких источниках, Django остановит свой поиск при первом
совпадении.
Источник аутентификации — это обычный класс, который
имеет два метода: get_user(id) и
authenticate(**credentials).
Метод get_user() принимает параметр
id, который может быть именем пользователя,
идентификатором в базе данных, да всем чем угодно, и
возвращает объект User.
Метод authenticate() принимает
удостоверение личности в виде именованных аргументов. Обычно
это выглядит так:
class MyBackend(object):
def authenticate(self, username=None, password=None):
# Check the username/password and return a User.
Но также может принимать элемент FIXME???, например:
class MyBackend(object):
def authenticate(self, token=None):
# Check the token and return a User.
Другими словами, метод authenticate()
должен проверять полученное удостоверение личности и должен
возвращать объект User, который
соответствует переданному удостоверению, если последнее
является верным. В противном случае метод должен возвращать
None.
Интерфейс администратора Django плотно объединён с собственным
объектом User, описанным в главе
«Сессии, пользователи и регистрация». Для
взаимодействия с этой системой лучше всего создавать объект
User для каждого пользователя, который
существует в вашем источнике (т.е., для вашего LDAP, вашей
внешней SQL базе данных и так далее.). Либо вы разработаете
для этого скрипт, либо ваш метод
authenticate() сделает это при первом
входе пользователя в систему.
Ниже представлен пример источника, который аутентифицирует
пользователей по переменным имени и пароля, определённым в
файле конфигурации, и создаёт объект
User при первой аутентификации
пользователя:
from django.conf import settings
from django.contrib.auth.models import User, check_password
class SettingsBackend(object):
"""
Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.
Use the login name, and a hash of the password. For example:
ADMIN_LOGIN = 'admin'
ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de'
"""
def authenticate(self, username=None, password=None):
login_valid = (settings.ADMIN_LOGIN == username)
pwd_valid = check_password(password, settings.ADMIN_PASSWORD)
if login_valid and pwd_valid:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
# Create a new user. Note that we can set password
# to anything, because it won't be checked; the password
# from settings.py will.
user = User(username=username, password='get from settings.py')
user.is_staff = True
user.is_superuser = True
user.save()
return user
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
| Пред. | Уровень выше | След. |
| Глава 16. Интеграция с унаследованным | Начало | Интеграция с унаследованными веб приложениями |
0 comments | Make a comment