2012-11-21 35 views
7

我如何檢查用戶是否是使用php_ldap模塊的組的一部分?PHP LDAP:如何搜索用戶是否在組中?

我完全新的LDAP,因此有些困惑......

用google搜索,我想出這個至今:

$ds=ldap_connect($ldapHost, $ldapPort); 
if ($ds) { 
    $r=ldap_bind($ds, $ldapRdn, $ldapPassword); 
    $filter = "(sAMAccountName=" . $uid . ")"; 
    $attr = array("memberof"); 
    $result = ldap_search($ds, $ldapDN, $filter, $attr) or exit("Unable to search LDAP server"); 

我不知道這是否是正確的,因爲它是從AD的特定體系中獲得的。 問題似乎是$ ldapDN。這是我尋找的權利?我的羣組「定義」是:

cn=User,ou=Profiles,ou=App_DEV,ou=ApplicationRights,O=MyCompany.COM 

我該如何做這項檢查?

編輯:。

這裏是我的解決辦法發現「接受的答案」和審判&錯誤」我認爲答案在很大程度上取決於你的特定系統上的幫助

//This is the User group DN 
$ldapDN = "cn=User,ou=Profiles,ou=App_DEV,ou=ApplicationRights,O=MyCompany.COM"; 
$filter = "(uniqueMember=uid=" . $uid . ",ou=Users,O=MYCOMPANY.COM)"; 
$attr = array('uniqueMember'); 
$result = ldap_search($ldapConnection, $ldapDN, $filter, $attr): 
$entries = ldap_get_entries($ldapConnection, $result); 
ldap_unbind($ldapConnection); 
return intval($entries["count"]) > 0; 

回答

6

會員信息通常是存儲在組中 - 以'member'或'memberUid'屬性的形式表示,'member'表示成員對象的完整DN(專有名稱),並且看起來像'uid = username,ou = users,dc = example,dc = com'。如果是memberUid,那麼這個值就是'username'。

找出目錄中正在使用哪種方法的方法是使用類似Apache Directory Studio這樣的分析組。

除'member'屬性外,AD在包含該組的DN的用戶的記錄中存儲memberOf屬性。但大多數目錄不這樣做,這可能是爲什麼你的代碼不工作。

什麼你要找的是像這樣的過濾器:

// & means "And" the next sibling items: 
// so "find items that have the objectClass of group and a member whose DN is user_dn 
(&(objectClass=group)(member=[user_dn])) 

(&(objectClass=group)(memberUid=[user_uid])) 

所以你的情況

$result = ldap_search(
    $ds, 
    'dc=mycompany,dc=com', // The base from which to start your search. (could be an OU too, like 'ou=restricted,dc=mycompany,dc=com') 
    '(&(objectClass=group)(member=uid=tom,ou=users,dc=mycompany,dc=com))' 
); 

或者,如果您的組去了memberUid,你會改變過濾器爲

$filter = '(&(objectClass=group)(member=username))'; 

$ result然後應包含具有「用戶名」作爲成員的組記錄列表。