如何使用php_ldap模块检查用户是否属于组?
我是ldap的新手,因此有点困惑...
到目前为止,我已经通过谷歌搜索提出了以下建议:
$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的soemthign。
问题似乎是$ 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;
最佳答案
成员资格信息通常以“成员”或“memberUid”属性的形式存储在组中。 “成员”表示成员对象的完整DN(专有名称),看起来像“uid =用户名,ou =用户,dc =示例,dc = com”。对于memberUid,该值将只是“用户名”。
找出目录中正在使用的方法的方法是使用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)(memberUid=username))';
然后,$ result应包含具有“用户名”作为成员的组记录的列表。