Використання розширення 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, значно розширюючи можливі сценарії використання.