Авторизация через 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 сервером.