Знакомство с python-ldap
Написания программ, которые работает с LDAP, становится очень простым с использованием Python и LDAP. Пакет python-ldap содержит модуль, который обёртывает OpenLDAP C API и предоставляет объектно-ориентированный API клиента LDAP серверов. Этот пакет также содержит модуль для других операций связанных с LDAP, таких как обработка LDIF, LDAPURL, LDAP3 схемы и другое.
В текущее время стандартная реализация Python не содержит python-ldap, но Вы можете скачать этот пакет отсюда.
Простое приложение
Лучший способ понять работу пакета — написать программу-пример. Давай напишем небольшой пример, который будет получать информацию о контакте от LDAP сервера.
Первое, что необходимо сделать это импортировать ldap модуль. И так откроем любимый текстовый редактор и введем import ldap. Для этой программы, нам понадобится создать две функции:
- main(), в которой происходит соединение с LDAP сервером и вызов функции поиска
- my_search(), в которой происходит получение и отображение данных от сервера
Давайте создадим нашу главную функцию и инициализируем переменные для аутентификации на LDAP сервере. Это будет примерно вот так:
def main():
server = "ldap.somewhere.edu"
who = ""
cred = ""
Теперь нам необходимо ключевое слов, по которому мы будем искать:
keyword = "ryan"
Далее нам нужно подключиться к LDAP серверу.
try:
l = ldap.open(server)
l.simple_bind_s(who, cred)
print "Successfully bound to server.\n"
Теперь мы готовы для поиска. Мы также обрабатываем возможные ошибки:
print "Searching..\n"
my_search(l, keyword)
except ldap.LDAPError, error_message:
print "Couldn't Connect. %s " % error_message
Создадим my_search:
def my_search(l, keyword):
Переменные base, scope, filter и retrieve_attributes — параметры метода search. Base используется для DN записи, откуда должен начаться поиск. Вы можете оставить его пустым для этого примера:
base = ""
Для scope мы используем SCOPE_SUBTREE для поиска по объектам и их потомкам.
scope = ldap.SCOPE_SUBTREE
Наш фильтр поиска состоит из cn и нашего keyword. Добавление знаков звездочки до и после keyword будет сопоставимо с любой строкой содержащей «rayn».
filter = "cn" + "*" + keyword + "*"
Последний аргумент, который мы передаем в методы search, используется для возвращения всех атрибутов каждой записи.
retrieve_attributes = None
Теперь, давайте установим дополнительные переменные, счетчик записей, результирующий список и тайм-аут запроса.
count = 0
result_set = []
timeout = 0
Начинаем поиск с помощь вызова метода search у объекта :
try:
result_id = l.search(base, scope, filter, retrieve_attributes)
Сохраняем результат в result_set списке:
while 1:
result_type, result_data = l.result(result_id, timeout)
if (result_data == []):
break
else:
if result_type == ldap.RES_SEARCH_ENTRY:
result_set.append(result_data)
И выводим результат:
if len(result_set) == 0:
print "No Results."
return
for i in range(len(result_set)):
for entry in result_set[i]:
try:
name = entry[1]['cn'][0]
email = entry[1]['mail'][0]
phone = entry[1]['telephonenumber'][0]
desc = entry[1]['description'][0]
count = count + 1
print "%d.\nName: %s\nDescription: %s\nE-mail: %s\nPhone: %s\n" %\
(count, name, desc, email, phone)
except:
pass
except ldap.LDAPError, error_message:
print error_message
if __name__=='__main__':
main()
Теперь после запуска нашей программы мы увидим список всех найденных записей.
