Компонент 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\Component\Ldap\Adapter\QueryInterface::SCOPE_SUB, що відповідає області 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.