PHP LDAP:如何搜索用户是否在组中?

时间:2012-11-21 05:47:40

标签: php ldap

如何使用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;

1 个答案:

答案 0 :(得分:6)

会员信息通常以“成员”或“memberUid”属性的形式存储在组中。 'member'表示成员对象的完整DN(可分辨名称),看起来像'uid = username,ou = users,dc = example,dc = com'。对于memberUid,值只是'username'。

找出目录中使用的方法的方法是使用Apache Directory Studio之类的内容来分析组。

除了'member'属性之外,AD还在用户的记录中存储了memberOf属性,该记录包含该组的DN。但是大多数目录都没有这样做,这可能是你的代码不能正常工作的原因。

您正在寻找的是这样的过滤器:

// & 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应该包含一个以'username'作为成员的组记录列表。