Поиск адресов с помощью LDAP

Задача
Необходимо запросить у LDAP-сервера адресную информацию.

Решение
Для этого применяется расширение PHP LDAP:

$ds = ldap_connect('ldap.example.com') or die($php_errormsg);
ldap_bind($ds) or die($php_errormsg);
$sr = ldap_search($ds, 'o=Example Inc., c=US', 'sn=*') or die($php_errormsg);
$e = ldap_get_entries($ds, $sr) or die($php_errormsg);
for ($i=0; $i < $e['count']; $i++) {
echo $info[$i]['cn'][0] . ' (' . $info[$i]['mail'][0] . ')
';
}
ldap_close($ds) or die($php_errormsg);

Обсуждение
LDAP (Lightweight Directory Access Protocol) означает облегченный протокол доступа к справочникам. LDAP-сервер хранит справочную информацию, такую как имена и адреса, и позволяет ее запрашивать.

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

Кроме того, вместо плоской структуры, предоставляемой базой данных, LDAP-сервер позволяет создать иерархию. Например, сотрудников компании можно разделить по отделам, в которых они работают: на отдел сбыта, технический отдел и производственный отдел; или по региональному признаку: на работающих в Северной Америке, Европеи Азии.


Таким образом, можно без труда найти всех сотрудников опре-
деленного подразделения компании.

В случае применения LDAP хранилище адресов называется источником данных (data source). Каждый элемент хранилища имеет уникальный глобальный идентификатор, известный как отмеченное имя (distinguished name). Это отмеченное имя содержит как персональное имя, так и информацию о компании. Например, John Q. Smith, работающий в американской компании Example Inc., имеет отмеченное имя cn=John Q. Smith, o=Example Inc., c=US. В LDAP cn означает стандартное имя, o – название организации, а c – страну.
Необходимо разрешить в PHP поддержку LDAP с помощью параметра --with-ldap. Можно загрузить LDAP-сервер с http://www.openldap.org.

Этот рецепт предполагает наличие базовых знаний LDAP. Дополнительную информацию ищите в статьях из раздела «O’Reilly Network» по адресу http://www.onlamp.com/topics/apache/ldap. Взаимодействие с LDAP-сервером выполняется в четыре этапа: соединение, аутентификация, поиск записей и выход. Помимо поиска можно также добавлять, изменять и удалять записи.

Для того чтобы открыть транзакции, нужно соединиться с определенным LDAP-сервером, а затем идентифицировать себя в рамках процесса, известного как связывание (binding):

$ds = ldap_connect('ldap.example.com') or die($php_errormsg);
ldap_bind($ds) or die($php_errormsg);

Если передать функции ldap_bind() только дескриптор соединения, $ds, то связывание будет анонимным.


Имя пользователя и пароль, если они необходимы, передаются при связывании в качестве второго и третьего параметра:

ldap_bind($ds, $username, $password) or die($php_errormsg);

После входа можно запросить информацию. Поскольку данные организованы иерархически, то надо указать базовое отмеченное имя в качестве второго параметра. Наконец, передается критерий поиска. Например, ниже показано, как найти всех сотрудников по фамилии Jones в компании Example Inc., находящейся в стране US:

$sr = ldap_search($ds, 'o=Example Inc., c=US', 'sn=Jones')
or die($php_errormsg);
$e = ldap_get_entries($ds, $sr)
or die($php_errormsg);

После того как функция ldap_search() возвратит результат, вызовите функцию ldap_get_entries() для получения определенной записи данных. Затем выполните цикл по массиву элементов, $e:

for ($i=0; $i < $e['count']; $i++) {
echo $e[$i]['cn'][0] . ' (' . $e[$i]['mail'][0] . ')
';
}

Не вызывайте функцию count($e), а возьмите вычисленный заранее размер записи, хранящийся в переменной $e['count']. Внутри цикла напечатайте первое стандартное имя и адрес электронной почты каждого человека.


Например:

David Sklar (sklar@example.com)
Adam Trachtenberg (adam@example.com)

Функция ldap_search() ищет в базе по всему дереву, начиная с отмеченного имени и ниже. Чтобы ограничить результаты поиска определенным уровнем, вызовите функцию ldap_list(). Поскольку в этом случае поиск ведется в меньшем множестве записей, то функция ldap_list() может оказаться значительно быстрее функции ldap_search().

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Отправка почты
Отправка почты в кодировке MIME
Отправка сообщений в новостные группы Usenet
Поиск в DNS
Получение и размещение файлов с помощью FTP

Вернуться в раздел: PHP / 17. Интернет-службы