【问题标题】:Retrieve AD groups of a user in PHP在 PHP 中检索用户的 AD 组
【发布时间】:2021-11-20 07:41:12
【问题描述】:

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

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

通过这样做:

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

效果很好,我在$groups 中获得了所有组名。到目前为止一切顺利。

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

$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 配置中禁用它们?我的意思是,它们能以某种方式被禁用吗?

【问题讨论】:

    标签: php active-directory ldap


    【解决方案1】:

    关于子字符串过滤器,您的问题是关于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']);
    

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

    @见Indexed attributes in AD

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 2015-12-13
      • 2014-04-08
      • 2020-02-28
      • 1970-01-01
      相关资源
      最近更新 更多