Импорт пользователей LDAP в базу данных django
Я хочу импортировать пользователей базы данных ActiveDirectory в Django. Для этого я пытаюсь использовать модуль django_auth_ldap.
Вот что я уже пробовал:
в моих settings.py:
AUTH_LDAP_SERVER_URI = "ldap://example.fr"
AUTH_LDAP_BIND_DN = 'cn=a_user,dc=example,dc=fr'
AUTH_LDAP_BIND_PASSWORD=''
AUTH_LDAP_USER_SEARCH = LDAPSearch('ou=users,dc=example,dc=fr', ldap.SCOPE_SUBTREE, '(uid=%(user)s)')
AUTH_LDAP_GROUP_SEARCH = LDAPSearch('ou=groups,dc=example,dc=fr', ldap.SCOPE_SUBTREE, '(objectClass=groupOfNames)')
AUTH_LDAP_GROUP_TYPE = ActiveDirectoryGroupType()
#Populate the Django user from the LDAP directory
AUTH_LDAP_USER_ATTR_MAP = {
'first_name': 'sAMAccountName',
'last_name': 'displayName',
'email': 'mail'
}
AUTHENTICATION_BACKENDS = (
'django_auth_ldap.backend.LDAPBackend',
'django.contrib.auth.backends.ModelBackend',
)
Тогда я звоню python manage.py syncdb
без результата. Нет предупреждений, нет ошибок, ничего не обновлено в таблице auth_user. Есть что-то очевидное, что я забыл сделать?
2 ответа
Глядя на документацию для django_auth_ldap
похоже, что модуль на самом деле не проходит через пользователей LDAP и не загружает их в базу данных. Вместо этого он аутентифицирует пользователя по LDAP, а затем добавляет или обновляет его в auth_users
с информацией, которую он получает из LDAP, когда пользователь входит в систему.
Если вы хотите предварительно заполнить базу данных всеми пользователями в Active Directory, похоже, вам нужно написать сценарий, который напрямую запрашивает AD и вставляет пользователей.
Примерно так должно начаться:
import ldap
l = ldap.initialize('ldap://your_ldap_server') # or ldaps://
l.simple_bind_s("cn=a_user,dc=example,dc=fr")
users = l.search_ext_s("memberOf=YourUserGroup",\
ldap.SCOPE_SUBTREE, \
"(sAMAccountName=a_user)", \
attrlist=["sAMAccountName", "displayName","mail"])
# users is now an array of members who match your search criteria.
# *Each* user will look something like this:
# [["Firstname"],["LastName"],["some@email.address"]]
# Note that each field is in an array, even if there is only one value.
# If you only want the first value from each, you can transform the results:
# users = [[field[0] for field in user] for user in users]
# That will transform each row into something like this:
# ["Firstname", "Lastname", "some@email.address"]
# TODO -- add to the database.
Я оставил вам обновление базы данных, поскольку у меня нет никакой информации о вашей настройке.
Если вам нужна дополнительная информация о запросах LDAP, ознакомьтесь с вопросами LDAP здесь, в Stackru - и я также нашел эту статью полезной.
Я бы сказал, что вы действительно не хотите использовать здесь django_auth_ldap, так как это просто создает пользователей по запросу при входе в систему (как отметили другие). Вместо этого вы можете просто использовать необработанный модуль python_ldap для выполнения необработанного запроса LDAP:
username = "..."
password = "..."
scope = ldap.SCOPE_SUBTREE
base = "ou=...,dc=...,dc=..."
filter="..."
retrieve_attributes=['cn','uid','displayName']
l = ldap.open("your.ldap.server")
l.protocol_version = ldap.VERSION3
l.simple_bind(username, password)
results = l.search_s(base, scope, filter, retrieve_attributes)
А затем переберите результаты, чтобы вставить их в вашу модель.
Мне нужно было сделать нечто подобное, и я нашел полезным API-интерфейс LDAPBackend.populate_user(user_name).
from django_auth_ldap.backend import LDAPBackend
user = LDAPBackend().populate_user('user_name')
Поскольку каждый вызов будет выдавать запросы LDAP и набор запросов на выборку / обновление / вставку БД, это больше подходит для получения или создания случайных пользователей (для маскировки под них / проверки того, как приложение ищет их), а не для массового их создания.,