Компонент Ldap
Дата оновлення перекладу 2023-08-21
Компонент Ldap
Компонент Ldap надає способи для зʼєднання з LDAP-сервером (OpenLDAP або Активним каталогом).
Установка
1
$ composer require symfony/ldap
Note
Якщо ви встановлюєте цей компонент поза додатком Symfony, вам потрібно підключити
файл vendor/autoload.php
у вашому коді для включення механізму автозавантаження
класів, наданих Composer. Детальніше можна прочитати у цій статті.
Використання
Клас Ldap надає методи для аутентифікації та запитів до LDAP-сервера.
Клас Ldap
використовує AdapterInterface,
щоб спілкуватися з LDAP-сервером. Адаптер
для вбудованого розширення LDAP PHP, наприклад, може бути сконфігурований, використовуючи
наступні оцпії:
host
- IP або імʼя хосту LDAP-сервера
port
- Порт, використовуваний для доступу до LDAP-серверу
version
- Версія LDAP-протоколу для використання
encryption
-
Протокол шифрування:
ssl
,tls
абоnone
(за замовчуванням) connection_string
-
Ви можете використати цю опцію замість
host
іport
, щоб підключитися до LDAP-серверу optReferrals
- Вказує, чи слідувати вам автоматично за посиланнями, поверненими LDAP-сервером
options
- Опції LDAP-сервера, визначені у ConnectionOptions
Наприклад, щоб приєднатися до start-TLS захищеного LDAP-серверу:
1 2 3 4 5 6
use Symfony\Component\Ldap\Ldap;
$ldap = Ldap::create('ext_ldap', array(
'host' => 'my-server',
'encryption' => 'ssl',
));
Або ви можете напряму вказати рядок підключення:
1 2 3
use Symfony\Component\Ldap\Ldap;
$ldap = Ldap::create('ext_ldap', array('connection_string' => 'ldaps://my-server:636'));
Метод bind() аутентифікує раніше сконфігурований звʼязок, використовуючи як відмінне імʼя (ВІ), так і пароль користувача:
1 2 3 4
use Symfony\Component\Ldap\Ldap;
// ...
$ldap->bind($dn, $password);
Caution
Коли LDAP-сервер дозволяє неаутентифіковані привʼязки, порожній пароль завжди буде валідним.
Після привʼязки (або якщо ви включили анонімну аутентифікацію на вашому LDAP-сервері), ви можете запитати LDAP-сервер, використовуючи метод find():
1 2 3 4 5 6 7 8 9
use Symfony\Component\Ldap\Ldap;
// ...
$query = $ldap->query('dc=symfony,dc=com', '(&(objectclass=person)(ou=Maintainers))');
$results = $query->execute();
foreach ($results as $entry) {
// Зробити щось з результатами
}
За замовчуванням, записи LDAP завантажуються ліниво. Якщо ви хочете вилучити всі сутності за один виклик і зробити щось з масивом результатів, ви можете використати метод toArray():
1 2 3 4 5 6 7
use Symfony\Component\Ldap\Ldap;
// ...
$query = $ldap->query('dc=symfony,dc=com', '(&(objectclass=person)(ou=Maintainers))');
$results = $query->execute()->toArray();
// Зробити щось з масивом результатів
За замовчуванням, LDAP-запити використовують область Symfony
,
що відповідає області LDAP_SCOPE_SUBTREE
функції ldap_search.
Ви також можете використати SCOPE_BASE
(повʼязану з областю LDAP_SCOPE_BASE
в ldap_read) і SCOPE_ONE
(повʼязану з областю LDAP_SCOPE_ONELEVEL
в ldap_list):
1 2 3
use Symfony\Component\Ldap\Adapter\QueryInterface;
$query = $ldap->query('dc=symfony,dc=com', '...', ['scope' => QueryInterface::SCOPE_ONE]);
Використайте опцію filter
, щоб вилучати лише деякі конкретні атрибути:
$query = $ldap->query('dc=symfony,dc=com', '...', ['filter' => ['cn', 'mail']);
Створення або оновлення записів
Компонент Ldap надає інструменти для створення, оновлення або навіть видалення LDAP записів:
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
use Symfony\Component\Ldap\Entry;
use Symfony\Component\Ldap\Ldap;
// ...
$entry = new Entry('cn=Fabien Potencier,dc=symfony,dc=com', [
'sn' => ['fabpot'],
'objectClass' => ['inetOrgPerson'],
]);
$entryManager = $ldap->getEntryManager();
// Створення нового запису
$entryManager->add($entry);
// Пошук та оновлення існуючого запису
$query = $ldap->query('dc=symfony,dc=com', '(&(objectclass=person)(ou=Maintainers))');
$result = $query->execute();
$entry = $result[0];
$phoneNumber = $entry->getAttribute('phoneNumber');
$isContractor = $entry->hasAttribute('contractorCompany');
// імена атрибутів у методах getAttribute() і hasAttribute() чутливі до регістру
// передайте FALSE в якості другого аргументу методу, щоб зробити їх нечутливими
$isContractor = $entry->hasAttribute('contractorCompany', false);
// Додавання або видалення значень атрибутів з декількома значеннями ефективніше, ніж використання update()
$entryManager->addAttributeValues($entry, 'telephoneNumber', ['+1.111.222.3333', '+1.222.333.4444']);
$entryManager->removeAttributeValues($entry, 'telephoneNumber', ['+1.111.222.3333', '+1.222.333.4444']);
// Видалення існуючого запису
$entryManager->remove(new Entry('cn=Test User,dc=symfony,dc=com'));
Масове оновлення
Використайте метод менеджера записів applyOperations() для оновлення декількох атрибутів за раз:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
use Symfony\Component\Ldap\Entry;
use Symfony\Component\Ldap\Ldap;
// ...
$entry = new Entry('cn=Fabien Potencier,dc=symfony,dc=com', [
'sn' => ['fabpot'],
'objectClass' => ['inetOrgPerson'],
]);
$entryManager = $ldap->getEntryManager();
// Додавання декількох email-адрес за раз
$entryManager->applyOperations($entry->getDn(), [
new UpdateOperation(LDAP_MODIFY_BATCH_ADD, 'mail', 'new1@example.com'),
new UpdateOperation(LDAP_MODIFY_BATCH_ADD, 'mail', 'new2@example.com'),
]);
Можливі типи операцій: LDAP_MODIFY_BATCH_ADD
, LDAP_MODIFY_BATCH_REMOVE
,
LDAP_MODIFY_BATCH_REMOVE_ALL
, LDAP_MODIFY_BATCH_REPLACE
. Параметр
$values
повинен бути NULL
при використанні типу операції
LDAP_MODIFY_BATCH_REMOVE_ALL
.