我正在嘗試獲取經過身份驗證的用戶所屬的組串列。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']);
好吧,現在我沒有得到任何組。如果成員屬性使用用戶的完整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配置中禁用它們?我的意思是,它們可以以某種方式禁用嗎?
uj5u.com熱心網友回復:
關于子字串過濾器,您的問題是關于哪些/如何在 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,您仍然必須查找匹配的組條目。
@see AD 中的索引屬性
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/361349.html
