Компонент Ldap

Дата обновления перевода 2023-08-21

Компонент Ldap

Компонент Ldap предоставляет способы для соединения с LDAP-сервером (OpenLDAP или Активным каталогом).

Установка

1
$ composer require symfony/ldap

Note

Если вы устанавливаете этот компонент вне приложения Symfony, вам нужно подключить файл vendor/autoload.php в вашем коде для включения механизма автозагрузки классов, предоставляемых Composer. Детальнее читайте в этой статье.

Использование

Класс Ldap предоставляет методы для аутентификации и запросов к LDAP-серверу.

Класс Ldap использует AdapterInterface, чтобы общаться с LDAP-сервером. adapter для встроенного расширения 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
32
33
34
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);

$entry->setAttribute('email', ['fabpot@symfony.com']);
$entryManager->update($entry);

// Добавление или удаление значений аттрибутам с несколькими значениями более эффективно, чем использование 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.