Интеграция Django с системой аутентификации

Опубликовал: Friday, February 17, 2024 в категории Django | Пока нет комментариев

Django допускает возможность интеграции с существующей системой аутентификации, в которой применяются собственные источники имен и паролей пользователей или используются свои методы аутентификации.

Например, в организации может быть настроен LDAP-каталог, где хранятся имена и пароли всех служащих. И сетевому администратору, и самим пользователям было бы очень неудобно иметь разные учетные записи в LDAP-каталоге и в приложениях Django.

Для решения этой проблемы система аутентификации Django позволяет подключать иные источники аутентификации. В этом случае можно либо переопределить принятую по умолчанию схему хранения информации о пользователях в базе данных, либо использовать стандартную систему в сочетании с другими.

Определение источников аутентификации

Django поддерживает специальный список источников информации для аутентификации. Когда вызывается метод django.contrib.auth. authenticateQ (см. главу 14), фреймворк Django пытается выполнить аутентификацию пользователя, обращаясь ко всем источникам по очереди. Если первый источник возвращает ошибку, Django пробует второй и так далее до тех пор, пока не будут проверены все источники.

Список источников аутентификации определяется в параметре AUTHEN- TICATION_BACKENDS. Это должен быть кортеж, состоящий из путей Python, указывающих на классы, которые реализуют процедуру аутентификации. Сами классы могут находиться в любом каталоге, указанном в пути Python.

По умолчанию параметр 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): tt Проверить имя пользователя и пароль и вернуть User.

Но можно также аутентифицировать по произвольному маркеру, например:

class MyBackend(object):

def authenticate(self, token^None): tt Проверить маркер и вернуть User.

В любом случае метод authenticate должен проверить полученные учетные данные и вернуть соответствующий объект User, если аутентификация прошла успешно. В противном случае он должен вернуть значение None.

Административный интерфейс Django тесно увязан с объектом User, который Django создает на основе информации, хранящейся в базе данных. Справиться с этой проблемой проще всего, создав объект User для каждого пользователя, зарегистрированного в источнике аутентификации (LDAP-каталоге, внешней базе данных и т. д.). Для этого можно написать сценарий, который сделает это заранее, или реализовать метод authenticate так, чтобы он создавал запись в базе данных Django при первом входе пользователя.

В следующем примере приводится реализация источника, который ау- тентифицирует пользователя, сравнивая его имя и пароль с параметрами в файле settings.ру, и при первой успешной аутентификации создает объект Django User.

from django.conf import settings

from django.contrib.auth.models import User, check_password class SettingsBackend(object):

Аутентифицировать, сравнивая с ADMIN_LOGIN и ADMIN_PASSWORD. Использовать имя пользователя и свертку пароля, например: 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:

tt Создать нового пользователя. Пароль может быть tt любым, потому что он все равно не проверяется; tt вместо него проверяется пароль из settings, ру. 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

Дополнительные сведения об источниках аутентификации см. в официальной документации по Django.

Источник: Головатый А., Каплан-Мосс Дж. Django. Подробное руководство, 2-е издание. - Пер. с англ. - СПб.: Символ- Плюс, 2010. - 560 е., ил.

Похожие посты:

Комментировать

Your email address will not be published. Required fields are marked *