Вы когда-нибудь хотели простой способ хранить информацию о стиле адресной книги и информацию о сети рядом с любой заказанной информацией?
Если это так, то есть технология, которая существует с 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 . Он не делает никаких предположений относительно используемой схемы или информации, которую вы храните.
Здесь, в первой части серии, я собираюсь:
- Вы познакомитесь с основами настройки OpenLDAP
- Показать, как загрузить набор записей
- Покажет вам, как подключиться к нему и выполнить некоторые основные операции
терминология
Прежде чем мы это сделаем, нам нужно немного разобраться в терминологии. Продолжая аналогию с 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 />'; }
Обновление записи
Теперь, когда мы рассмотрели основной поиск и итерацию записей, давайте посмотрим на обновление записи. Это требует трех шагов:
- Извлечение записи
- Обновление существующего свойства или установка нового
- Сохранение записи обратно на сервер 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 более подробно:
- Выполнение более сложных поисков
- Вставка записей
- Перемещение записей
- Создание безопасных соединений
Если вы хотите получить больше информации о том, что мы рассмотрели сегодня, в разделе дальнейшего чтения есть множество ссылок, которые должны удовлетворить ваше любопытство.
Дальнейшее чтение
- https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-a-basic-ldap-server-on-an-ubuntu-12-04-vps
- http://www.linux.com/learn/tutorials/376144-manage-ldap-from-the-command-line
- http://charithmahawatta.blogspot.de/2011/03/ldapbind-unable-to-bind-to-server.html
- http://www.debuntu.org/how-to-set-up-a-ldap-server-and-its-clients/
- http://www.debuntu.org/how-to-set-up-a-ldap-server-and-its-clients/
- http://www.linux.com/learn/tutorials/376144-manage-ldap-from-the-command-line
- http://framework.zend.com/manual/2.3/en/modules/zend.ldap.usage.html#updating-the-ldap
- http://serverfault.com/questions/295200/ldap-attribute-givenname-is-not-allowed
- http://www.zytrax.com/books/ldap/ape/
- http://www.tldp.org/HOWTO/LDAP-HOWTO/utilities.html
- http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol
https://github.com/zendframework/Component_ZendLdap