跳到内容

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
加密协议: ssltlsnone (默认)
connection_string
您可以选择使用此选项代替 hostport 来连接到 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\Component\Ldap\Adapter\QueryInterface::SCOPE_SUB 范围,这对应于 ldap_search 函数的 LDAP_SCOPE_SUBTREE 范围。您还可以使用 SCOPE_BASE (与 ldap_readLDAP_SCOPE_BASE 范围相关)和 SCOPE_ONE (与 ldap_listLDAP_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_ADDLDAP_MODIFY_BATCH_REMOVELDAP_MODIFY_BATCH_REMOVE_ALLLDAP_MODIFY_BATCH_REPLACE 。当使用 LDAP_MODIFY_BATCH_REMOVE_ALL 运算类型时,参数 $values 必须为 NULL

本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本