Импорт пользователей LDAP в базу данных django - PullRequest
9 голосов
/ 28 июля 2011

Я хочу импортировать пользователей базы данных 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. Есть что-то очевидное, что я забыл сделать?

Ответы [ 3 ]

7 голосов
/ 28 июля 2011

Глядя на документацию для 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 здесь, в Stackoverflow - и я также нашел эту статью полезной .

2 голосов
/ 28 июля 2011

Я бы сказал, что вы действительно не хотите использовать здесь 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)

А затем итерируйте результаты, чтобы вставить их в вашу модель.

1 голос
/ 18 февраля 2019

Мне нужно было сделать что-то похожее, и я нашел полезным API-интерфейс LDAPBackend.populate_user (user_name).

from django_auth_ldap.backend import LDAPBackend
user = LDAPBackend().populate_user('user_name')

Учитывая, что каждый вызов будет выдавать запросы LDAP и куча БД select / updated / insertзапросов, это больше подходит для получения или создания случайных пользователей (для маскировки под них / проверки того, как приложение ищет их), а не для массового их создания.

...