LDAP в Python

Перевод статьи Ryan Kulla «LDAP Programming in Python».

LDAP в Python

В этой статье Вы узнаете, как Ваши приложения могут взаимодействовать с LDAP серверами. Большинство основных языков программирования имеют API для работы с LDAP, но я выбрал Python, потому что это, возможно, самый простой и ясный язык для демонстрации. Для понимания этой статьи необходимы знания Python и LDAP.

Знакомство с 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()

Теперь после запуска нашей программы мы увидим список всех найденных записей.

Оригинальный текст статьи на www.linuxjournal.com

Перевод КОМТЕТ komtet.ru

 

Вам также может помочь