Skip to main content

Авторизация через LDAP

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

Данная возможность реализована с помощью пакета django-auth-ldap (Django Authentication Using LDAP). Чтобы получить более подробную информацию по использованию авторизации с помощью LDAP, перейдите по ссылке.

Конфигурация сервера LDAP

Чтобы активировать авторизацию через LDAP, добавьте в файл конфигурации conf.py следующие строки:

import ldap
from django_auth_ldap.config import LDAPSearch

AUTHENTICATION_BACKENDS = [
'django_auth_ldap.backend.LDAPBackend',
'django.contrib.auth.backends.ModelBackend',
]

# LDAP CONFIGURATION
AUTH_LDAP_SERVER_URI = 'ldap://openldap'

AUTH_LDAP_BIND_DN = "cn=admin,dc=example,dc=org"
AUTH_LDAP_BIND_PASSWORD = "admin"

AUTH_LDAP_USER_SEARCH = LDAPSearch("dc=example,dc=org", ldap.SCOPE_SUBTREE, '(uid=%(user)s)')

AUTH_LDAP_USER_ATTR_MAP = {
'first_name': 'givenName',
'last_name': 'sn',
'email': 'mail',
}

LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"handlers": {"console": {"class": "logging.StreamHandler"}},
"loggers": {"django_auth_ldap": {"level": "DEBUG", "handlers": ["console"]}},
}

Ниже представлена подробная информация о данной конфигурации.

В случае, если LDAP сервер не запущен локально, используя стандартный порт, прежде всего, необходимо указать сервер с помощью AUTH_LDAP_SERVER_URI. Допускается любое значение, которое поддерживает используемый LDAP сервер. Например, openldap поддерживает списки URI, представленные через запятую или пробел.

AUTH_LDAP_SERVER_URI = "ldap://openldap"

После того, как соединение с LDAP сервером установлено, необходимо произвести авторизацию пользователя используя логин и пароль. Используемый метод копирования данных пользователь "поиск и привязка" (Search/bind), предполагает подключение к LDAP серверу анонимно или используя отдельную учетную запись для поиска и привязки DN (Distinguished name) пользователя к базе платформы с последующей попыткой использования пароля пользователя.

Поскольку LDAP производит поиск по всем доступным файлам конфигурации, рекомендуется использовать класс LDAPSearch для инкапсуляции информации. В таком случае, параметр filter должен содержать заполнитель %(user)s.

Для поиска и привязки данных пользователя используется следующая конфигурация:

AUTH_LDAP_USER_SEARCH = LDAPSearch("dc=example,dc=org", ldap.SCOPE_SUBTREE, '(uid=%(user)s)')

Будет произведена анонимная привязка с поиском "ou=users,dc=example,dc=com" по объектам uid с совпадающим именем пользователя. Далее будет произведена попытка привязки с использованием DN и пароля пользователя. В результате поиска должен быть возвращен только один результат, иначе аутентификация будет неудачной.

Если анонимная привязка не может быть совершена, возможно использование авторизующего пользователя: AUTH_LDAP_BIND_DN для привязки DN и AUTH_LDAP_BIND_PASSWORD для привязки пароля.

AUTH_LDAP_BIND_DN = "cn=admin,dc=example,dc=org"
AUTH_LDAP_BIND_PASSWORD = "admin"

При поиске данных, содержимое пользовательских полей и LDAP атрибутов должно быть соотнесено с помощью карты атрибутов AUTH_LDAP_USER_ATTR_MAP:

AUTH_LDAP_USER_ATTR_MAP = {
'first_name': 'givenName',
'last_name': 'sn',
'email': 'mail',
}

LDAPBackend использует стандартную конфигурацию Python logging module для записи логов ошибок в django_auth_ldap. Для использования Django LOGGING, необходимо добавить в файл конфигурации следующие строки:

LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"handlers": {"console": {"class": "logging.StreamHandler"}},
"loggers": {"django_auth_ldap": {"level": "DEBUG", "handlers": ["console"]}},
}

Пользовательские объекты

Авторизация пользователей с помощью модуля django-auth-ldap задействует пользовательские модели. При авторизации пользователя создается сущность, представляющая данные пользователя в базе данных.

Поскольку поиск LDAP не учитывает регистр, также, по умолчанию происходит поиск по существующим учетным записям Django с точным вхождением (фильтр iexact). Новые имена пользователей создаются в нижнем регистре.

Поле пароля учетных записей, созданных с помощью LDAPBackend по умолчанию не заполнено. Если в базе данных Django у пользователя установлен пароль, данному пользователю становится доступна авторизация с помощью ModelBackend (если данная опция включена). В таком случае, авторизация произойдет независимо от ответа LDAP. Использование валидного пароля небезопасно, но может применяться, если определенным пользователям необходимо предоставить постоянный доступ к платформе в условиях перебоев связи с LDAP сервером.