paweldecowski/ldap-dn

解析和操作 LDAP 区分名称

v1.0 2021-03-17 18:49 UTC

This package is auto-updated.

Last update: 2024-09-18 02:26:55 UTC


README

PHP 的 LDAP 区分名称解析和操作库。

Packagist Version Travis (.com) Coveralls GitHub

目录

功能

  • 通过索引访问单个 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 类及其组件类(RdnAttribute)实现了 __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 字符串(如果从左到右读取)是相反的。在一个有 nRdnDn 中,最右侧的 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

DnRdnAttribute 是不可变的,因此所有操作函数都返回一个新对象。

移除 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

当调用未实现的方法时抛出。