Використання розширення OpenLDAP для PHP у ServBay
ServBay — це потужне локальне середовище розробки веб-додатків, яке підтримує різноманітні технологічні стеки. Для розробників PHP-додатків, які потребують взаємодії з LDAP (Lightweight Directory Access Protocol) серверами, ServBay має заздалегідь встановлене розширення OpenLDAP для PHP, що дозволяє легко його увімкнути та використовувати. У цій статті ви дізнаєтеся, як у середовищі ServBay скористатися цим розширенням для реалізації функцій автентифікації користувачів, виконання пошуку у каталозі та іншого.
Що таке OpenLDAP і розширення OpenLDAP для PHP?
OpenLDAP – це популярна відкрита реалізація LDAP-протоколу, яка надає функціональність каталогових сервісів. LDAP-протокол — це прикладний протокол для доступу й адміністрування розподілених сервісів каталогів, який широко використовується в корпоративному середовищі для автентифікації користувачів, управління організаційною структурою та адресними книгами.
Розширення OpenLDAP для PHP (зазвичай називається розширенням ldap) — це модуль для мови PHP, який містить набір функцій для комунікації з LDAP-серверами. За допомогою цього розширення PHP-додатки можуть підключатися до LDAP-серверів, виконувати bind (автентифікацію), пошук, додавання, зміну та видалення записів у каталозі.
У контексті ServBay, нас цікавить саме клієнтське розширення OpenLDAP для PHP, яке дозволяє вашому PHP-коду підключатися до зовнішніх LDAP-серверів і опрацьовувати їх. Зверніть увагу: сам ServBay не містить у собі сервер OpenLDAP.
Основні можливості розширення PHP OpenLDAP
За допомогою розширення OpenLDAP для PHP ви можете:
- Підключатися до LDAP-серверу — встановлювати з'єднання із зазначеним LDAP-сервером.
- Виконувати bind-операції — здійснювати анонімний bind або автентифікацію за DN (Distinguished Name) і паролем.
- Виконувати пошук по каталогу — шукати записи у каталозі за вказаними фільтрами та базою пошуку.
- Зчитувати інформацію про записи — отримувати атрибути та значення для кожного запису у результатах пошуку.
- Виконувати зміни — додавати нові записи, видаляти та змінювати атрибути існуючих записів.
- Обробляти помилки LDAP — отримувати детальну інформацію про причини невдалих операцій.
Сумісність розширення PHP OpenLDAP у ServBay
ServBay дозволяє встановлювати та використовувати декілька версій PHP. Розширення OpenLDAP зазвичай входить до стандартної офіційної збірки PHP і у PHP, що постачається разом із ServBay, воно практично завжди увімкнене за замовчуванням. Отже, працюючи з ServBay, ви швидше за все вже готові використовувати OpenLDAP без додаткових налаштувань.
Як перевірити, чи увімкнено OpenLDAP для PHP
Хоча ServBay орієнтований на роботу «з коробки» і найпоширеніші розширення вже активовані, перевірити їх роботу — гарна звичка. Найпростіший спосіб це зробити — скористатися функцією phpinfo().
У кореневій папці вашого сайту в ServBay (типово
/Applications/ServBay/www) створіть новий PHP-файл, наприклад,info.php.Додайте до цього файлу наступний вміст:
php<?php phpinfo(); ?>1
2
3Відкрийте у браузері адресу сайту, налаштовану в ServBay для цього файлу (наприклад,
http://servbay.demo/info.php).На сторінці, що згенерує
phpinfo(), знайдіть розділ із назвоюldap.Якщо такий розділ знайдено й у ньому є написи типу
LDAP Support enabled, це означає, що розширення OpenLDAP для PHP успішно завантажене та увімкнене.
Якщо розділ ldap відсутній, або навпроти LDAP Support бачите позначку «disabled», перевірте конфігурацію PHP чи конкретну збірку у ServBay або зверніться до служби підтримки ServBay. У переважній більшості випадків розширення активне за замовчуванням.
Використання OpenLDAP у PHP-коді
Після підтвердження, що розширення OpenLDAP увімкнене, ви можете у своєму PHP-додатку використовувати функції з префіксом ldap_* для взаємодії з LDAP-сервером. Нижче — базовий приклад підключення до LDAP, виконання bind від імені адміністратора, пошуку користувача та спроби автентифікації користувача.
Важливо: параметри на кшталт адреси LDAP-сервера, порта, DN адміністратора, пароля, бази пошуку, фільтра для пошуку конкретного користувача та самого пароля користувача в коді — це заповнювачі. У реальному використанні замініть їх на фактичні значення вашої LDAP-інфраструктури. Ніколи не залишайте справжні паролі у відкритому вигляді в робочому коді!
Зразок коду: базове підключення, пошук і автентифікація
Збережіть наведений нижче код як окремий PHP-файл у папці вашого сайту в ServBay (наприклад, ldap_test.php) і відкрийте його через браузер.
php
<?php
// --- Налаштування підключення до LDAP ---
// Замініть на адресу вашого LDAP-сервера. Для LDAPS використовуйте префікс ldaps:// і порт 636 за замовчуванням.
$ldapURI = "ldap://ldap.example.com:389";
// Замініть на DN адміністратора або користувача з правами на пошук
$ldapAdminRdn = "cn=admin,dc=example,dc=com";
// Замініть на пароль для DN адміністратора
$ldapAdminPassword = "admin_password";
// --- Налаштування пошуку користувача й автентифікації ---
// Замініть на DN бази пошуку вашого каталогу
$searchBase = "dc=example,dc=com";
// Замініть на фільтр для пошуку певного користувача, наприклад user з uid 'servbay-demo'
$searchFilter = "(uid=servbay-demo)";
// Замініть на пароль користувача, для якого виконується автентифікація
$userPasswordToAuthenticate = "user_password_for_servbay_demo";
echo "<h2>Приклад використання OpenLDAP для PHP у ServBay</h2>";
// 1. Підключення до LDAP-сервера
echo "<p>Спроба підключення до LDAP-сервера: {$ldapURI}...</p>";
$ldapConn = ldap_connect($ldapURI);
if (!$ldapConn) {
die("<p style='color: red;'>Помилка: не вдалося підключитися до LDAP-сервера.</p>");
}
echo "<p style='color: green;'>З’єднання з LDAP-сервером встановлено.</p>";
// Встановлення опцій LDAP (рекомендується задати версію протоколу і вимкнути referrals)
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
// 2. Автентифікація від імені адміністратора (для операцій пошуку)
echo "<p>Спроба автентифікуватися під DN адміністратора '{$ldapAdminRdn}'...</p>";
if (!ldap_bind($ldapConn, $ldapAdminRdn, $ldapAdminPassword)) {
echo "<p style='color: red;'>Помилка: не вдалося виконати bind адміністратора.</p>";
echo "<p style='color: red;'>LDAP-помилка: " . ldap_error($ldapConn) . "</p>";
ldap_unbind($ldapConn); // Закрити з’єднання
die();
}
echo "<p style='color: green;'>Bind адміністратора успішний.</p>";
// 3. Пошук користувача
echo "<p>Спроба пошуку за фільтром '{$searchFilter}' у базі DN '{$searchBase}'...</p>";
$searchResult = ldap_search($ldapConn, $searchBase, $searchFilter);
if (!$searchResult) {
echo "<p style='color: red;'>Помилка: LDAP-пошук не вдався.</p>";
echo "<p style='color: red;'>LDAP-помилка: " . ldap_error($ldapConn) . "</p>";
ldap_unbind($ldapConn); // Закрити з’єднання
die();
}
echo "<p style='color: green;'>Пошук виконано успішно.</p>";
// 4. Отримання результатів пошуку
$entries = ldap_get_entries($ldapConn, $searchResult);
if ($entries["count"] > 0) {
echo "<p>Знайдено записів: {$entries["count"]}.</p>";
// Припускаємо, що нас цікавить лише перший відповідний користувач
$userDn = $entries[0]["dn"];
echo "<p>DN першого відповідного користувача: <strong>{$userDn}</strong></p>";
// 5. Спроба автентифікації під DN користувача і його паролем
echo "<p>Спроба виконати bind під користувачем '{$userDn}'...</p>";
// Зверніть увагу: тут автентифікація виконується як користувач, а не як адміністратор
if (@ldap_bind($ldapConn, $userDn, $userPasswordToAuthenticate)) {
echo "<p style='color: green;'>Автентифікація користувача успішна!</p>";
} else {
echo "<p style='color: red;'>Не вдалося автентифікувати користувача.</p>";
echo "<p style='color: red;'>LDAP-помилка: " . ldap_error($ldapConn) . "</p>";
}
} else {
echo "<p>Користувача, що відповідає фільтру '{$searchFilter}', не знайдено.</p>";
}
// 6. Закриття з’єднання з LDAP
echo "<p>Закриття з’єднання з LDAP...</p>";
ldap_unbind($ldapConn);
echo "<p style='color: green;'>З’єднання закрито.</p>";
?>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Пояснення до коду
- Підключення (
ldap_connect): встановлює з'єднання з LDAP-сервером, повертає ідентифікатор з’єднання. - Встановлення опцій (
ldap_set_option): конфігурує поведінку з'єднання.LDAP_OPT_PROTOCOL_VERSION, 3— встановлює LDAPv3 (рекомендується).LDAP_OPT_REFERRALS, 0вимикає referrals (для простих застосувань це доцільно). - Bind (
ldap_bind): автентифікує користувача для роботи з сервером LDAP.- Анонімний bind:
ldap_bind($ldapConn)— без DN і пароля, обмежені права. - Автентифікований bind:
ldap_bind($ldapConn, $dn, $password)— автентифікація під заданим DN і паролем. У прикладі спершу bind адміністратора для пошуку, потім bind знайденого користувача — для перевірки пароля.
- Анонімний bind:
- Пошук (
ldap_search): шукає записи у вказаній базі пошукуsearchBaseза фільтромsearchFilter. - Отримання записів (
ldap_get_entries): отримує всі записи, що відповідають пошуку, у вигляді масиву. - Закриття з'єднання (
ldap_unbind): завершує сесію з LDAP і звільняє ресурси.
Зверніть увагу
- LDAP-сервер: приклад та інструкції стосуються лише клієнтської частини — взаємодії PHP з сервером LDAP. Вам потрібен доступний LDAP-сервер — локальний (окремо встановлений і налаштований) або корпоративний (віддалений/AD).
- Безпека: у продуктивному середовищі використовуйте змінні середовища або захищені конфігураційні файли для зберігання паролів і завжди підключайтесь через LDAPS (порт 636) для шифрованого з’єднання, а не відкритий порт 389.
- Обробка помилок: наведених обробників помилок достатньо лише для демонстрації; у реальних проектах використовуйте більш стійкий контроль винятків та ведіть журналювання.
- Формат DN: DN (Distinguished Name) повинен повністю відповідати налаштуванням вашого LDAP-сервера.
Часті питання (FAQ)
Q: Я не бачу розділ ldap у phpinfo(), або він вимкнений. Що робити?
A: У ServBay розширення OpenLDAP для PHP, як правило, увімкнене за замовчуванням. Переконайтеся, що переглядаєте вивід саме тієї версії PHP, яка зараз використовується. Якщо розширення відсутнє — спробуйте перевстановити відповідний PHP-пакет у ServBay або зверніться в службу підтримки.
Q: Код PHP виводить помилку Call to undefined function ldap_connect().
A: Це свідчить про те, що розширення OpenLDAP не завантажено або не ввімкнене. Виконайте валідацію через phpinfo(), як описано вище.
Q: Розширення увімкнене, але з’єднання або bind не працюють, помилка LDAP.
A: Перевірте конфігурацію підключення (адресу сервера, порт) і bind-дані (DN, пароль). Детальну інформацію про помилку можна отримати через ldap_error(), наприклад «Invalid credentials» (невірні облікові дані) або «Can't contact LDAP server» (сервер недоступний). Переконайтеся, що сервер працює й доступний у мережі.
Висновок
ServBay надає зручний і швидкий спосіб встановити й використовувати розширення OpenLDAP у PHP. Провівши просту перевірку, ви можете впевнитися, що ваша PHP-інфраструктура готова до комунікації з LDAP-серверами. Використовуючи функціонал PHP для роботи з LDAP, розробник може легко додати автентифікацію користувачів, доступ до каталогів та інші властивості для локальних веб-додатків у ServBay, значно розширюючи можливі сценарії використання.
