PHP LDAP: как искать, если пользователь находится в группе?

как я могу проверить, является ли пользователь частью группы с помощью модуля php_ldap?

Я совершенно новичок в ldap и, следовательно, немного запутался...

С googling я придумал это до сих пор:

$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");

Я не уверен, что это правильно, так как это было принято в форме soemthign для AD. Проблема, похоже, в $ldapDN. Это то, что я ищу, верно? Мои группы "определение":

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

как я могу это сделать проверить?

EDIT:

вот мое решение найдено с помощью "принятого ответа"и проб и ошибок". Я думаю, что ответ во многом зависит от вашей конкретной системы.

//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 ответов


информация о членстве обычно хранится в группе - в виде атрибута "member" или "memberUid". "member" представляет полное DN (различающееся имя) объекта-члена и будет выглядеть примерно так: "uid=username,ou=users,dc=example,dc=com". В случае memberUid значение будет просто "username".

способ выяснить, что используется в вашем каталоге, - проанализировать группу, используя что-то вроде Каталог Apache Студия.

в дополнение к атрибуту "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 должен содержать список записей группы, которые имеют "имя пользователя" в качестве члена.