检索 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
,您仍然需要查找匹配的组条目。
我正在尝试获取经过身份验证的用户所属的组列表。 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
,您仍然需要查找匹配的组条目。