Меню Закрыть

Php ldap список пользователей

Содержание

6 [2012-11-15 22:02:00]

Как получить список всех пользователей из LDAP с помощью PHP? Вышеприведенный код не работает в функции ldap_search, предупреждая это предупреждение

"Предупреждение: ldap_search(): Поиск: Ошибка операций"

мое имя пользователя, ldaphost и т.д. верны. Однако я не уверен в фильтрах.

Левинца Егор, 06 апреля 2012 года.

В порядке эксперимента, а также чтобы оказать помощь человеку в его затруднении, решил написать небольшую утилитку для отображения пользователей (а точнее, учётных записей пользователей), хранящихся в каталоге LDAP, по группам. Эксперимент состоял в том, чтобы обратиться к каталогу и получить из него данные через php API, чего я раньше не делал. Зная общие принципы взаимодействия с LDAP-каталогами и имея опыт написания подобных программ на perl API (с использованием модуля Net::LDAP), сделать это оказалось несложно. Все же я решил описать свою работу — возможно, она поможет кому-нибудь в разработке php-программ, взаимодействующих с LDAP-каталогом.

Исходные данные: имеется каталог (базовый DN dc=mycompany,dc=ru) со "стандартной" структурой для интеграции с samba: сведения об учётных записях пользователей хранятся в ветке ou=Users,dc=myconpany,dc=ru, сведения о группах пользователей — в ветке ou=Groups,dc=mycompany,dc=ru. Основная задача: отобразить нестандартную древовидную структуру: на первом уровне список групп, на втором — принадлежащие этим группам пользователи. Факультативная задача: при выборе пользователя из списка вывести некоторые сведения по нему.

Для упрощения примера подразумевается, что группы строятся на структурном объектном классе posixGroup , атрибут членства в группе — memberUid , значение которого совпадает с атрибутом uid учётной записи пользователя. Если у Вас за членство в группах и учётные записи пользователей отвечают другие атрибуты — измените код программы под Ваши настройки.

LDAP — относительно простой протокол с небольшим количеством операций. В нашем примере мы не собираемся изменять содержимое каталога (осуществляем доступ только для чтения), поэтому вся работа с каталогом будет выполнена за 4 операции: соединение с сервером каталога (connect), подключение к каталогу (bind), выполнение поиска необходимых нам данных (search) с выводом результатов, и, наконец, отключение от сервера (unbind). Все эти операции реализованы в php функциями с "говорящими" названиями: ldap_connect() , ldap_bind() , ldap_search() и ldap_unbind() . Эти и другие функции работы с LDAP в php описаны в соответствующей странице документации по php. Описаны, кстати, довольно неплохо, с хорошими примерами.

Поскольку при выполнении основной и факультативной задач осуществляются абсолютно одинаковые операции соединения, подключения и отключения от сервера, я решил вынести их в основную часть программы, а различающиеся операции поиска и отображения полученных в результате поиска данных — в отдельные функции. В первой функции get_main() производится поиск сведений о группах в ветке ou=Groups,dc=mycompany,dc=ru. Найденные группы, а также члены каждой из групп сортируются по алфавиту и выводится html-страница с древовидной структурой. Чтобы не изобретать велосипедов с отображением древовидной структуры, я воспользовался готовым модулем dhtmlxTree библиотеки компонентов dhtmlx. Вызов второй функции get_userinfo() выполняется при обращении к программе из ajax-запроса, генерируемого при нажатии на пользователя — члена группы в выведенной в браузер html-странице. В этой функции выполняется поиск в ветке ou=Users,dc=myconpany,dc=ru на совпадение имени пользователя с содержимым атрибута uid. Выбранные в результате поиска атрибуты записи пользователя оформляются в виде таблицы и загружаются в соответствующее информационное поле на html-странице.

Читайте также:  Совместимость роутера с модемом

‘; // Вывод таблицы с запрашиваемыми данными echo ‘

‘; foreach($LDAP[‘Attrs’] as $attr=>$desc) < echo ‘

‘; > echo ‘

‘ . $desc . ‘ ‘; if(isset($entries[0][$attr])) < array_shift($entries[0][$attr]); echo join(‘
‘, $entries[0][$attr]); > echo ‘

‘; > ?>

Выглядит это так:

Код программы с библиотеками dhtmlx и набором иконок можно скачать одним архивом здесь (

(PHP 4, PHP 5, PHP 7)

ldap_list — Одноуровневый поиск

Описание

Выполняет поиск для указанного filter в директории в рамках LDAP_SCOPE_ONELEVEL .

LDAP_SCOPE_ONELEVEL означает, что поиск должен возвратить только информацию, которая является следующим уровнем ниже base_dn , заданного при вызове. (Эквивалент вводу " ls" и получения списка файлов и папок в текущем рабочем каталоге.)

Список параметров

Идентификатор ссылки LDAP, возвращенный ldap_connect() .

Базовое DN для каталога.

Массив необходимых атрибутов, например, array("mail", "sn", "cn"). Обратите внимание, что "dn" возвращается всегда, независимо от того, какие типы атрибутов требуются.

Использование этого параметра намного более эффективно чем действие по умолчанию (которое должно возвратить все атрибуты и их присвоенные значения). Поэтому использование этого параметра нужно считать хорошей практикой.

Должен быть равен 1, только если требуются типы атрибута. Если установлено 0, то, по умолчанию, выбираются и типы атрибутов и значения атрибута.

Позволяет ограничить количество выбранных записей. Установка этого параметра как 0 означает, что ограничение отсутствует.

Этот параметр НЕ может переопределять предустановку sizelimit на стороне сервера. Хотя его можно установить ниже.

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

Устанавливает число секунд, ограничивающее процесс поиска. Установка этого параметра как 0 означает, что ограничение отсутствует.

Этот параметр НЕ может переопределять предустановку timelimit на стороне сервера. Хотя его можно установить ниже.

Определяет, как псевдонимы должны быть обработаны во время поиска. Может быть одним из следующих:

  • LDAP_DEREF_NEVER — (по умолчанию) псевдонимы никогда не разыменовываться.
  • LDAP_DEREF_SEARCHING — псевдонимы должны быть разыменованы во время поиска, но не при определении местоположения базового объекта поиска.
  • LDAP_DEREF_FINDING — псевдонимы должны быть разыменованы при определении местоположения базового объекта, но не во время поиска.
  • LDAP_DEREF_ALWAYS — псевдонимы должны всегда разыменовываться всегда.

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает идентификатор результата поиска или FALSE в случае ошибки.

Список изменений

Версия Описание
7.3 Добавлена поддержка параметра serverctrls

Примеры

Пример #1 Выводит список всех организационных единиц организации

// $ds верный идентификатор ссылки на сервер директории

$basedn = "o=My Company, c=US" ;
$justthese = array( "ou" );

$sr = ldap_list ( $ds , $basedn , "ou=*" , $justthese );

$info = ldap_get_entries ( $ds , $sr );

for ( $i = 0 ; $i $info [ "count" ]; $i ++) <
echo $info [ $i ][ "ou" ][ 0 ];
>
?>

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.