检索 PHP 中用户的 AD 组

Retrieve AD groups of a user in PHP

我正在尝试获取经过身份验证的用户所属的组列表。 Http 服务器是 Apache2,我绑定到 Active Directory 服务器。

据我所知,我能做到的唯一方法是获取恰好在其 member 属性中包含该用户的所有组。

通过这样做:

$groups = ldap_list($ldap, 'OU=Groups,DC=server,DC=com', '(objectClass=group)', ['cn']);

它工作得很好,我得到了 $groups 中的所有组名。到目前为止一切顺利。

现在,在确保经过身份验证的用户(比如 userdp08)在 以前列出的几个组的成员 属性,我更改过滤器:

$groups = ldap_list($ldap, 'OU=Groups,DC=server,DC=com',
    '(&(member=userdp08)(objectClass=group))', ['cn']);

好吧,现在我没有得到任何组。如果 member 属性使用完整的 DN用户,我改为:

$groups = ldap_list($ldap, 'OU=Groups,DC=server,DC=com',
    '(&(member=CN=userdp08*)(objectClass=group))', ['cn']);

我已经尝试了所有这些过滤器,但无济于事:

'(&(member=*CN=userdp08*)(objectClass=group))'
'(&(member=*userdp08*)(objectClass=group))'
'(&(member=*08*)(objectClass=group))'

连这个都不行:

'(objectClass=gro*)'

但是,如果我检索用户的完整 DN 并将其用于完全匹配过滤器,我会得到适当的正确分组。

我的问题是:子字符串过滤器 似乎不起作用,它们是否可能在 AD 配置中被禁用?我的意思是,可以以某种方式禁用它们吗?

关于子字符串过滤器,你的问题是关于which/how attributes are indexed in AD

member 属性没有子字符串索引(实际上默认情况下它没有索引),因此您必须 传递完整的 dn 以获得匹配项,或修改 searchFlags 属性 以指定架构中属性的索引。

知道 objectCategory 已编入索引也很好,而 objectClass 未编入索引。

但这不是检索用户组的唯一方法。在 AD 中,您获得了 memberOf 属性,它使成员资格过滤更容易且性能更高(在 OpenLDAP 中,默认情况下未启用)。顾名思义,您可以查询给定用户并读取 memberOf 属性以获取该用户所属的所有组,例如。 :

$groups = ldap_list($ldap, 'OU=Users,DC=server,DC=com', 
        '(&(objectCategory=person)(CN=userdp08*))', ['memberOf']);

或:

$groups = ldap_list($ldap, 'OU=Users,DC=server,DC=com', 
        '(sAMAccountName=userdp08)', ['memberOf']);

缺点是您只能获得该属性的值,is/are 此类组的 dn,因此如果您想阅读他们的 cn,您仍然需要查找匹配的组条目。

@see Indexed attributes in AD