paweldecowski / ldap-dn
解析和操作 LDAP 区分名称
Requires
- php: >=7.1
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-18 02:26:55 UTC
README
PHP 的 LDAP 区分名称解析和操作库。
目录
功能
- 通过索引访问单个 RDN
- 迭代 RDN
- 按属性名称过滤
- 支持转义特殊字符
- 访问属性值
- 移除 DN 的一部分
- 构造 DNs
- 不区分大小写但保留大小写(查找不区分大小写,但属性名称和值的案例保留)
- 100% 测试覆盖率
需求
- PHP 7.1
安装
$ composer require paweldecowski/ldap-dn
如何使用
解析 DNs 并访问其组件
从字符串创建 DN 对象
$dn = LdapDn\Dn::fromString('cn=john.doe,ou=it,ou=leadership,dc=example,dc=org');
回到字符串表示形式
Dn 类及其组件类(Rdn、Attribute)实现了 __toString 方法。这意味着在字符串上下文中,它们将自动转换为字符串。
$dn = LdapDn\Dn::fromString('cn=john.doe,ou=it,ou=leadership,dc=example,dc=org'); echo $dn; // 'cn=john.doe,ou=it,ou=leadership,dc=example,dc=org' echo $dn[0]; // 'dc=org' echo $dn->filter('ou'); // 'ou=it,ou=leadership'
通过索引访问 RDN
注意,Dn 对象中的 Rdn 与 DN 字符串(如果从左到右读取)是相反的。在一个有 n 个 Rdn 的 Dn 中,最右侧的 Rdn 在索引 0,最左侧的 Rdn 在索引 n-1。这是因为将根对象放在索引 0 上更自然、更常见。
$dn = LdapDn\Dn::fromString('cn=john.doe,ou=it,ou=leadership,dc=example,dc=org'); echo $dn[0]; // 'dc=org' echo $dn[4]; // 'cn=john.doe'
迭代 RDN
$dn = LdapDn\Dn::fromString('cn=john.doe,ou=it,ou=leadership,dc=example,dc=org'); foreach ($dn as $rdn) { echo $rdn, "\n"; }
输出
dc=org
dc=example
ou=leadership
ou=it
cn=john.doe
访问属性
$dn = LdapDn\Dn::fromString('cn=john.doe,ou=it,ou=leadership,dc=example,dc=org'); echo $dn[0]['dc']->getValue(); // 'org' echo $dn[4]['cn']->getValue(); // 'john.doe'
如果只有一个指定属性的实例,您可以直接从 Dn 对象获取其值。
$dn = LdapDn\Dn::fromString('cn=john.doe,ou=it,ou=leadership,dc=example,dc=org'); echo $dn->getValue('cn'); // 'john.doe'
如果找到多个具有指定名称的属性,则会抛出 MultipleAttributesReturnedException。
多值 RDN
Rdn 可以有多个属性,用 + 字符分隔。您可以使用数组解引用语法访问它们。
$dn = LdapDn\Dn::fromString('cn=john.doe+uid=123,ou=it,ou=leadership,dc=example,dc=org'); echo $dn[4]; // 'cn=john.doe+uid=123' echo $dn[4]['cn']; // 'cn=john.doe' echo $dn[4]['cn']->getValue(); // 'john.doe' echo $dn[4]['uid']; // 'uid=123' echo $dn[4]['uid']->getValue(); // '123'
如果您不知道它们的名称,也可以迭代属性。
$dn = LdapDn\Dn::fromString('cn=john.doe+uid=123,ou=it,ou=leadership,dc=example,dc=org'); foreach ($dn[4] as $attribute) { echo $attribute->getName(), ' is ', $attribute->getValue(), "\n"; }
输出
cn is john.doe
uid is 123
特殊字符
$dn = LdapDn\Dn::fromString('cn=doe\, john,ou=it,ou=leadership,dc=example,dc=org'); echo $dn[4]; // 'cn=doe\, john' echo $dn[4]['cn']->getValue(); // 'doe, john'
按属性名称过滤
$dn = LdapDn\Dn::fromString('cn=john.doe,ou=it,ou=leadership,dc=example,dc=org'); echo $dn->filter('ou'); // 'ou=it,ou=leadership'
请注意,尽管 filter() 的结果是 Dn 对象,但它可能不是有效的区分名称(例如,如果您移除了根 RDN)。这个库没有关于您的 LDAP 结构的知识,因此不能保证有效性。
获取父 DN
$dn = LdapDn\Dn::fromString('cn=john.doe,ou=it,ou=leadership,dc=example,dc=org'); echo $dn->getParent(); // 'ou=it,ou=leadership,dc=example,dc=org' echo $dn->getParent()->getParent(); // 'ou=leadership,dc=example,dc=org'
操作 DNs
Dn、Rdn 和 Attribute 是不可变的,因此所有操作函数都返回一个新对象。
移除 DN 的一部分
有时您可能想移除 DN 的一部分,例如其基本 DN。
$dn = LdapDn\Dn::fromString('cn=john.doe,ou=it,ou=leadership,dc=example,dc=org'); $fragmentToRemove = LdapDn\Dn::fromString('dc=example,dc=org'); echo $dn->withRemoved($fragmentToRemove); // 'cn=john.doe,ou=it,ou=leadership'
构造 DNs
尽管该库的主要目的是解析 DNs,但您也可以构造它们。
use LdapDn\Dn; use LdapDn\Rdn; use LdapDn\Attribute; $dn = new Dn([ new Rdn([new Attribute('dc', 'org')]), new Rdn([new Attribute('dc', 'example')]), new Rdn([new Attribute('ou', 'leadership')]), new Rdn([new Attribute('ou', 'it')]), new Rdn([new Attribute('cn', 'doe, john'), new Attribute('uid', '123')]), ]); echo $dn; // 'cn=doe\, john+uid=123,ou=it,ou=leadership,dc=example,dc=org'
大多数 RDN 包含单个属性,因此您可以使用简写语法构造它们。
use LdapDn\Dn; use LdapDn\Rdn; use LdapDn\Attribute; $dn = new Dn([ Rdn::withNameAndValue('dc', 'org'), Rdn::withNameAndValue('dc', 'example'), Rdn::withNameAndValue('ou', 'leadership'), Rdn::withNameAndValue('ou', 'it'), new Rdn([new Attribute('cn', 'doe, john'), new Attribute('uid', '123')]), ]); echo $dn; // 'cn=doe\, john+uid=123,ou=it,ou=leadership,dc=example,dc=org'
异常
AttributeNotFoundException
如果在一个 Dn 中找不到属性,则抛出。
DnNotFoundException
如果在另一个 Dn 中找不到 Dn,则抛出。
InvalidAttributeStringException
如果表示属性的字符串格式不正确,则抛出。
MultipleAttributesReturned exception
当期望返回一个 Attribute 时返回多个 Attribute,则抛出。
NotImplementedException
当调用未实现的方法时抛出。