Назад

PHP и LDAP: Как работать с Active Directory

 

 

 

 

 

 

 

 

 

 

 

Наиболее важный вопрос, относящийся к данной статье, звучит так: "Зачем использовать PHP для доступа к Active Directory, если для этого есть Пользователи и Группы?" На этот вопрос можно ответить так: Довольно часто руководство хочет делегировать часть функций Active Directory (AD) пользователям, которые не должны иметь доступа к Пользователям и Группам LDAP. Когда-то я работал в компании, в которой нужно было, чтобы секретарь мог добавлять и удалять пользователей, обновлять пароли и контактные данные из удобного веб-интерфейса. Я собрал простой веб-интерфейс с использованием PHP и LDAP, так появилась эта статья.

Шаг 1: Настройка поддержки LDAP в PHP
Если в PHP ещё нет поддержки LDAP, вам понадобится её включить, в зависимости от операционной системы. На Linux это можно сделать несколькими способами - скомпилировать PHP с поддержкой LDAP (работает на всех дистрибутивах):

./configure --with-ldap [other configuration options]

или установить соответствующий для данного дистрибутива пакет php-ldap и добавить следующую строку в php.ini

extension=mod_ldap.so

и перезапустить Apache.

На Windows раскомментировать или добавить следующую строку в php.ini

extension=php_ldap.dll

и перезапустить Apache/IIS

Шаг 2: Подключение к Active Directory.
После того, как вы включили поддержку LDAP в PHP, можно устанавливать соединение. Вставьте следующий код в PHP файл:

<?php
$adconn = ldap_connect("ldap://ldap.example.com");
ldap_set_option($adconn, LDAP_OPT_PROTOCOL_VERSION, 3);

Таким образом, в приведенном выше коде мы создали соединение и присвоили ему ldap.example.com. Некоторые инсталляции LDAP и функции требуют явной установки версии протокола, для меня стало привычкой устанавливать версию протокола, чтобы предотвратить появление ошибок, что я и сделал в строке, следующей за соединением.

Шаг 3: Привязка PHP к Active Directory.
Конечно, анонимное соединение это хорошо, но его необходимо привязать к Active Directory, прежде чем предпринять какие-либо действия.

В зависимости от настроек безопасности, анонимной привязки может быть достаточно для выполнения поиска по Active Directory, одноко для доступа к чему-либо пользователь должен обладать соответствующими правами. Поскольку пользователи приходят и уходят, хорошей идеей было бы создать пользователя с правами исключительно для PHP, который мог бы взаимодействовать с LDAP с правами администратора – в данном примере мы зайдем под пользователем "ldapweb".

Для привязки к Active Directory:

$ldap_bind = ldapbind($adconn, "ldapweb", "password");

Код аккуратный и говорит сам за себя – данная строка привязывает соединение Active Directory с помощью имени пользователя "ldapweb" и пароля "password".

Несмотря на то, что переменная $ldap_bind объявлена, она нигде не используется, это является частым источником путаницы для новичков в PHP LDAP. Это логическая переменная, которая используется для проверки того, было ли соединение привязано или нет.

Теперь для всех запросов будет использоваться первоначальное LDAP соединение $adconn.

Шаг 4: Поиск в Active Directory.
Здесь находится самое интересное в библиотеке PHP LDAP. Функция ldap_search чрезвычайно мощна, хотя и является невероятно сложной. С точки зрения возможностей она похожа на SQL запрос. Мы будем использовать её более простым образом, хотя мы и собираемся получить список пользователей Active Directory.

$dn = "OU=People,OU=staff,DN=ldap,DN=myawesomesite,DN=com";
$attribute = array("samAccountName");
$result = ldap_search($adconn, $dn, "(cn=*)", $attribute);
$entries = ldap_get_entries($ad, $result);

for ($i = 0; $i < $entries["count"]; $i++) {
echo $entries[$i]["samAccountName"];
echo "<br></br>";
}

Код не совсем понятный, так что давайте разберем его построчно, чтобы выяснить, что происходит. При обращении к LDAP через PHP, все переменные возвращаются в виде массива, именно поэтому нельзя просто использовать $result сразу. Используя функцию ldap_get_entries, мы перебираем $result и получаем многомерный массив, который содержит номер интересующей записи и переменную (в данном случае " SamAccountName"). Цикл for обрабатывает каждую запись и выводит имя с HTML тегом для перехода на другую строку, что позволяет построчно вывести каждую переменную displayname в базе данных.

Шаг 5: Добавление изменение и удаление записей базы данных.
Я рассмотрю все операции в одном разделе, поскольку они имеют более или менее одинаковый синтаксис. Чтобы добавить, заменить или удалить записи в базе данных используйте функции ldap_mod_add, ldap_mod_replace и ldap_delete. Посмотрим, как добавлять записи в базу данных:

$newuser["samAccountName"] = "awesomeman";
$newuser["givenname"] = "awesome";
$newuser["sn"] = "man";
$result = ldap_mod_add($adconn, $dn, $newuser);

Этого достаточно по ldap_mod_add. Функция ldap_mod_replace использует такой же синтаксис, кроме того, что нужно создать переменную $dn, содержащую то, что необходимо заменить. Например, если нужно заменить следующие записи в awesomeman вместо того, чтобы добавлять их, напишите следующий код:

$dn = "CN=Awesome Man,OU=People,OU=staff,DN=ldap,DN=myawesomesite,DN=com";
$newuser["samAccountName"] = "awesomeman";
$newuser["givenname"] = "awesome";
$newuser["sn"] = "man";
$result = ldap_mod_replace($adconn, $dn, $newuser);

Работать с ldap_delete ещё проще, требуется только определенный DN и $adconn:
$dn = "CN=Awesome Man,OU=People,OU=staff,DN=ldap,DN=myawesomesite,DN=com";
$result = ldap_delete($adconn, $dn);

Шаг 5: Объединим всё в одно целое.


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

<?php
$adconn = ldap_connect("ldap://ldap.myawesomesite.com");
ldap_set_option($adconn, LDAP_OPT_PROTOCOL_VERSION, 3);
$ldap_bind = ldapbind($adconn, "ldapweb", "password");

function replaceUser($old_username, $new_username) {
$dn = "CN=$old_username,OU=People,OU=staff,DN=ldap,DN=myawesomesite,DN=com";
$user["samAccountName"] = $new_username;
ldap_mod_replace($adconn, $dn, $user);
}

$old_username = $argv[0];
$new_user = $argv[1];
replaceUser($old_username, $new_user);

Заключение.

Конечно, существует много способов использования комбинации PHP + LDAP, но в данной статье показано, как с помощью PHP быстро подключаться и работать с сервером Active Directory. Теперь для вас не будет сюрпризом, если менеджер попросит вас сделать веб-интерфейс для смены пароля.

 


 

Назад

 

 

 

 

 

 

 

 

 

 

 

Copyright © blockfer.ru