Ldap 组件
Ldap 组件提供了一种连接到 LDAP 服务器(OpenLDAP 或 Active Directory)的方法。
安装
1
$ composer require symfony/ldap
注意
如果您在 Symfony 应用程序之外安装此组件,您必须在代码中引入 vendor/autoload.php
文件,以启用 Composer 提供的类自动加载机制。阅读 这篇文章 了解更多详情。
用法
Ldap 类提供了对 LDAP 服务器进行身份验证和查询的方法。
Ldap
类使用 AdapterInterface 与 LDAP 服务器通信。例如,PHP 内置 LDAP 扩展的 适配器 可以使用以下选项进行配置
host
- LDAP 服务器的 IP 或主机名
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', [
'host' => 'my-server',
'encryption' => 'ssl',
]);
或者您可以直接指定连接字符串
1 2 3
use Symfony\Component\Ldap\Ldap;
$ldap = Ldap::create('ext_ldap', ['connection_string' => 'ldaps://my-server:636']);
bind() 方法使用用户的专有名称 (DN) 和密码对先前配置的连接进行身份验证
1 2 3 4
use Symfony\Component\Ldap\Ldap;
// ...
$ldap->bind($dn, $password);
危险
当 LDAP 服务器允许未经验证的绑定时,空白密码将始终有效。
您还可以使用 saslBind() 方法,通过 SASL 绑定到 LDAP 服务器
1 2
// this method defines other optional arguments like $mech, $realm, $authcId, etc.
$ldap->saslBind($dn, $password);
绑定到 LDAP 服务器后,您可以使用 whoami() 方法获取已验证和授权用户的专有名称 (DN)。
7.2
saslBind()
和 whoami()
方法在 Symfony 7.2 中引入。
一旦绑定(或者如果您在 LDAP 服务器上启用了匿名身份验证),您可以使用 query() 方法查询 LDAP 服务器
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) {
// Do something with the results
}
默认情况下,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();
// Do something with the results array
默认情况下,LDAP 查询使用 Symfony
范围,这对应于 ldap_search
函数的 LDAP_SCOPE_SUBTREE
范围。您还可以使用 SCOPE_BASE
(与 ldap_read
的 LDAP_SCOPE_BASE
范围相关)和 SCOPE_ONE
(与 ldap_list
的 LDAP_SCOPE_ONELEVEL
范围相关)
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();
// Creating a new entry
$entryManager->add($entry);
// Finding and updating an existing 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');
// attribute names in getAttribute() and hasAttribute() methods are case-sensitive
// pass FALSE as the second method argument to make them case-insensitive
$isContractor = $entry->hasAttribute('contractorCompany', false);
$entry->setAttribute('email', ['[email protected]']);
$entryManager->update($entry);
// Adding or removing values to a multi-valued attribute is more efficient than using 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']);
// Removing an existing entry
$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();
// Adding multiple email addresses at once
$entryManager->applyOperations($entry->getDn(), [
new UpdateOperation(LDAP_MODIFY_BATCH_ADD, 'mail', '[email protected]'),
new UpdateOperation(LDAP_MODIFY_BATCH_ADD, 'mail', '[email protected]'),
]);
可能的运算类型有 LDAP_MODIFY_BATCH_ADD
、 LDAP_MODIFY_BATCH_REMOVE
、 LDAP_MODIFY_BATCH_REMOVE_ALL
、 LDAP_MODIFY_BATCH_REPLACE
。当使用 LDAP_MODIFY_BATCH_REMOVE_ALL
运算类型时,参数 $values
必须为 NULL
。