Статьи

Основы LDAP с PHP

Вы когда-нибудь хотели простой способ хранить информацию о стиле адресной книги и информацию о сети рядом с любой заказанной информацией?

Если это так, то есть технология, которая существует с 1993 года, и которая, несмотря на то, что у таких технологий нет таких крутых факторов, как Node.js и Go , позволяет делать именно это. Это называется LDAP!

Что такое LDAP?

LDAP является сокращением от Lightweight Directory Access Protocol и был разработан в Мичиганском университете в 1993 году Тимом Хоусом , Стивом Киллом , Колином Роббинсом и Венджик Йонгом .

Короче говоря, LDAP — это готовая к Интернету версия более раннего протокола под названием X.500 , который был разработан еще в 80-х годах Международным союзом электросвязи (МСЭ) для управления телефонными каталогами и службами каталогов.

Хотя LDAP технически относится к протоколу, имя часто применяется и к клиенту, и к серверу. Если это помогает, вы можете думать об этом, как SQL для серверов баз данных; это язык, используемый для взаимодействия с серверами с поддержкой LDAP.

Существует несколько серверов с поддержкой LDAP, наиболее распространенным из которых является ActiveDirectory от Microsoft ; которая была распространена на протяжении всей линейки продуктов с момента выпуска Windows 2000.

Также есть выбор с открытым исходным кодом, который мы будем использовать в этой серии статей под названием OpenLDAP . Он не делает никаких предположений относительно используемой схемы или информации, которую вы храните.

Здесь, в первой части серии, я собираюсь:

  1. Вы познакомитесь с основами настройки OpenLDAP
  2. Показать, как загрузить набор записей
  3. Покажет вам, как подключиться к нему и выполнить некоторые основные операции

терминология

Прежде чем мы это сделаем, нам нужно немного разобраться в терминологии. Продолжая аналогию с SQL, есть пара терминов, которые вам нужно знать, и которые я буду использовать на протяжении всей серии, которые вы можете найти в таблице ниже.

Срок LDAP Описание
дп Dn, или отличительное имя, является уникальным идентификатором записи. Это очень похоже на первичный ключ в реляционной базе данных.
Схема каталога (или просто схема) В каталоге LDAP значения записей регулируются схемой каталога. Схема каталога — это набор определений и ограничений, касающихся структуры информации каталога.
запись Запись очень похожа на запись в базе данных и содержит атрибуты, которые хранят данные для записи.
атрибут Атрибут очень похож на элемент в ассоциативном массиве или столбце в базе данных. Он определяет тип информации, которая может быть сохранена для этого атрибута, наряду с другими критериями, такими как правила сортировки и поиска, чувствительность к регистру и так далее.
сп сп сокращение от общего имени. Примером может служить «Джон Смит»
зп sn — сокращение от фамилии.

Терминология довольно сложна, поэтому я не могу охватить все это здесь. Но, надеюсь, этих основ достаточно, чтобы вы начали.

За более подробной информацией обращайтесь к этому руководству от O’Reilly или к записи LDAP в Википедии .

Установка сервера LDAP

Я никогда не находил установку и настройку OpenLDAP особенно простой, и большая часть информации, доступной в сети, может вводить в заблуждение или представлять собой смесь версий сервера. Вот мой лучший, самый краткий набор шагов, основанный на использовании сервера на основе Debian .

Во-первых, установите главный сервер и утилиты, выполнив следующие команды:

sudo apt-get install slapd ldap-utils 

Эти команды зададут вам ряд вопросов, установите сервер и настройте его запуск во время загрузки. После этого выполните следующую команду, которая поможет нам лучше настроить установку:

 dpkg-reconfigure slapd 

Это задаст ряд вопросов, и вот руководство для ответа на них:

  • Пропустить конфигурацию сервера OpenLDAP? нет
  • DNS доменное имя: homestead.localdomain
  • Название вашей организации: … независимо от & Co
  • Пароль администратора:
  • Подтвердите Пароль:
  • Ok
  • BDB
  • Вы хотите, чтобы ваша база данных была удалена при удалении slapd? нет
  • Переместить старую базу данных? да
  • Разрешить протокол LDAPv2? нет

Проверьте установку

Сделав это, давайте быстро проверим, что все работает, выполнив следующую команду:

 ldapsearch -x -b dc=homestead,dc=localdomain 

Вы не должны получать сообщение об ошибке, но если это так, убедитесь, что OpenLDAP работает; Вы можете сделать это, выполнив следующую команду:

 sudo netstat -tlnp | grep slapd 

Вы должны увидеть вывод, такой как следующий (отформатированный для удобочитаемости):

 tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 6556/slapd tcp6 0 0 :::389 :::* LISTEN 6556/slapd 

Заполнение базы данных

Теперь, когда сервер настроен, нам нужно загрузить его данными. Создайте новый файл с именем users.ldif и добавьте в него следующие записи:

 dn: cn=Sheldon Cooper,ou=People,dc=homestead,dc=localdomain cn: Sheldon Cooper objectClass: person objectClass: inetOrgPerson sn: Cooper dn: cn=Leonard Hofstadter,ou=People,dc=homestead,dc=localdomain cn: Leonard Hofstadter objectClass: person objectClass: inetOrgPerson sn: Hofstadter dn: cn=Howard Wolowitz,ou=People,dc=homestead,dc=localdomain cn: Howard Wolowitz objectClass: person objectClass: inetOrgPerson sn: Wolowitz dn: cn=Rajesh Koothrappali,ou=People,dc=homestead,dc=localdomain cn: Rasjesh Koothrappali objectClass: person objectClass: inetOrgPerson sn: Koothrappali 

Сохраняя файл, выполните следующую команду, чтобы загрузить информацию в базу данных:

 ldapadd -x -W -D "cn=admin,dc=homestead,dc=localdomain" -f users.ldif 

Это запросит у вас пароль, который вы установили ранее. Введите его, и вы должны увидеть результат, подобный следующему:

 adding new entry "cn=Sheldon Cooper,ou=People,dc=homestead,dc=localdomain" adding new entry "cn=Leonard Hofstadter,ou=People,dc=homestead,dc=localdomain" adding new entry "cn=Howard Wolowitz,ou=People,dc=homestead,dc=localdomain" adding new entry "cn=Rajesh Koothrappali,ou=People,dc=homestead,dc=localdomain" 

Убедитесь, что записи присутствуют

Теперь давайте быстро проверим, что записи доступны. Из командной строки запустите:

 ldapsearch -x -b "dc=homestead,dc=localdomain" -s sub "objectclass=*" 

Это должно отобразить вывод, подобный следующему, который я обрезал для удобства чтения:

 # extended LDIF # # LDAPv3 # base <dc=homestead,dc=localdomain> with scope subtree # filter: objectclass=* # requesting: ALL # # homestead.localdomain dn: dc=homestead,dc=localdomain objectClass: top objectClass: dcObject objectClass: organization o: homestead dc: homestead 

Взаимодействие с PHP

Выполнив все эти шаги, мы теперь готовы использовать PHP для запроса к серверу. Для простоты мы используем компонент Zend-Ldap из Zend Framework 2 .

Доступно несколько библиотек PHP LDAP , но я нашел наиболее эффективную и простую в использовании. Конечно, я немного евангелист Zend Framework, но, честно говоря, это самая простая библиотека, которую я нашел.

Для обработки зависимости, как и почти во всех PHP-проектах в наши дни, мы будем использовать Composer, чтобы сделать ее доступной. В каталоге вашего проекта создайте файл composer.json, как показано ниже.

 { "require": { "php": ">=5.3.0", "zendframework/zend-ldap": "2.3.*@dev" } } 

После этого запустите composer install чтобы создать каталог vendor и ввести зависимость.

Подключение к серверу LDAP

После этого создайте новый файл с именем index.php в корневом каталоге вашего проекта; там добавьте код ниже:

 <?php require 'vendor/autoload.php'; $baseDn = 'dc=homestead,dc=localdomain'; $options = array( 'host' => '192.168.10.10', 'password' => 'homestead', 'bindRequiresDn' => true, 'baseDn' => 'dc=homestead,dc=localdomain', 'username' => "cn=admin,$baseDn" ); $ldap = new Zend\Ldap\Ldap($options); $ldap->bind(); 

Сначала это сделает Zend\Ldap доступным через файл автозагрузки, созданный композитором. Затем я определил переменную $baseDn , чтобы код был намного более читабельным здесь, в статье.

Затем я создал массив с именем $options , в котором хранятся параметры конфигурации, которые мы будем использовать для инициализации объекта Zend\Ldap\Ldap .

В нем я указал имя хоста , пароль , имя пользователя и имя пользователя . Мы могли бы пропустить имя пользователя и пароль, но поскольку мы будем выполнять аутентифицированные операции, проще всего добавить их сейчас.

После инициализации нового объекта Zend\Ldap\Ldap я затем вызвал метод bind, чтобы установить соединение с сервером.

Поиск в базе данных

Теперь давайте выполним первую и самую простую операцию на сервере LDAP: поиск. Код ниже будет искать каждую запись в ou=People,dc=homestead,dc=localdomain , которая будет возвращать четыре, которые мы загрузили ранее.

Первый аргумент (objectclass=*) определяет SQL-подобный фильтр. Это равносильно выполнению SELECT * . Последний аргумент выполняет поиск, который будет искать все записи.

Существует несколько различных типов поиска, о которых мы расскажем в следующей статье. Пока этого типа достаточно для наших нужд.

 $result = $ldap->search( '(objectclass=*)', "ou=People,$baseDn", Zend\Ldap\Ldap::SEARCH_SCOPE_SUB ); 

Далее мы будем перебирать записи двумя способами. Во-первых, мы вызовем метод toArray() для объекта $result , который мы передаем в json_encode . Я сделал это как простой способ отображения всей доступной информации.

 print json_encode($result->toArray()); 

В качестве альтернативы, мы можем перебрать набор данных, используя foreach, как показано ниже. В этом примере мы отобразили элементы dn и cn каждой записи.

 foreach ($result as $item) { echo $item["dn"] . ': ' . $item['cn'][0] . '<br />'; } 

Обновление записи

Теперь, когда мы рассмотрели основной поиск и итерацию записей, давайте посмотрим на обновление записи. Это требует трех шагов:

  1. Извлечение записи
  2. Обновление существующего свойства или установка нового
  3. Сохранение записи обратно на сервер LDAP
 $hm = $ldap->getEntry( "cn=Rajesh Koothrappali,ou=People,$baseDn" ); Zend\Ldap\Attribute::setAttribute( $hm, 'mail', '[email protected]' ); $ldap->update( "cn=Rajesh Koothrappali,ou=People,$baseDn", $hm ); 

В приведенном выше коде мы получили запись, вызвав метод getEntry, передав запись dn . Затем мы вызвали метод setAttribute() , указав объект записи, свойство, которое мы хотим установить, затем значение свойства.

Наконец, мы вызвали метод update() , passion в записи dn и объект записи. Все будет хорошо, запись будет обновлена.

Удаление записи

Теперь, когда мы можем искать и обновлять записи, давайте закончим, удалив запись. Для этого мы вызываем метод delete, передавая dn записи, которую мы хотим удалить.

Поскольку операция может завершиться с ошибкой, в этом примере я LdapException вызов в блок try / catch, который перехватывает LdapException если выброшено, и выводит причину сбоя.

Может быть множество причин для исключения, например, запись не существует и пользователь, которого мы аутентифицировали как не имеющий достаточных разрешений.

 try { $ldap->delete("cn=Hans Meier,ou=People,$baseDn"); } catch (\Zend\Ldap\Exception\LdapException $e) { print $e->getMessage(); } 

Завершение

И вот как настроить и взаимодействовать с сервером LDAP — в частности, с OpenLDAP — в PHP. Надеюсь, вам понравился этот краткий обзор того, как это сделать. В следующей статье мы рассмотрим LDAP более подробно:

  • Выполнение более сложных поисков
  • Вставка записей
  • Перемещение записей
  • Создание безопасных соединений

Если вы хотите получить больше информации о том, что мы рассмотрели сегодня, в разделе дальнейшего чтения есть множество ссылок, которые должны удовлетворить ваше любопытство.

Дальнейшее чтение