Компонент 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
,
соответствующую области 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
.