Запрашивать все группы пользователя с помощью Zend_Ldap

#php #zend-framework #ldap

#php #zend-framework #ldap

Вопрос:

Мне особо нечего показать, потому что я вообще не слишком хорошо знаком с ldap (Открытый каталог), и у меня возникли небольшие проблемы с пониманием того, как на самом деле запрашивать группы конкретного пользователя. Используя Zend_Auth_Adapter_Ldap(),

 $ldap = array(
    array('host' => 'od-master.foobar.net',
        'baseDn' => 'cn=users,dc=foobar,dc=net',
        'bindRequiresDn' => true,
        'accountCanonicalForm' => 2));

$authAdapter = new Zend_Auth_Adapter_Ldap($ldap);
// Set the input credential values to authenticate against
$authAdapter->setIdentity($form->getValue('username'));
$authAdapter->setCredential($form->getValue('password'));
//etc
  

У меня есть учетная запись, которая проходит проверку подлинности, но теперь мне нужно получить список групп, к которым принадлежит этот пользователь. Обычно я не из тех, кто обращается за помощью, не попробовав сначала что-то, но я даже не могу дойти до этого момента. Любая помощь приветствуется.

На случай, если мой вопрос не был очевиден: как вы запрашиваете все группы конкретного пользователя?

===== РЕДАКТИРОВАТЬ =====

Согласно приведенным предложениям, это была моя последняя попытка:

 $attributes = array('memberOf'); //also tried member
$users = $ldapAdapter->search('cn=username', $ldapAdapter->getBaseDn(), Zend_Ldap::SEARCH_SCOPE_SUB, $attributes);
foreach ($users as $user) {
   var_dump($user);
}
  

Я также безуспешно пытался сделать это за пределами Zend_Ldap.

 $attributes = array('memberOf'); //also tried member
$result = ldap_search($ldapAdapter->getResource(), $baseDn, 'cn=username', $attributes);
$info = ldap_get_entries($ldapAdapter->getResource(), $result);
  

В результате получается пустой массив. Любые дальнейшие указания были бы высоко оценены.

===== ПРАВКА 2 =====

Итак, я попытался полностью удалить Zend_Ldap, чтобы мне было проще тестировать, вот что у меня получилось, в результате чего возвращается array (‘count’ => 0).

 $resource = ldap_connect('od-master.foobar.net', 389);
ldap_set_option($resource, LDAP_OPT_PROTOCOL_VERSION, 3);
$bind = ldap_bind($resource, 'uid=johnc,cn=users,dc=foobar,dc=net', '***');
$result = ldap_search($resource, 'cn=users,dc=foobar,dc=net', '(cn=username)');
$info = ldap_get_entries($resource, $result);
  

Ответ №1:

Вы просто добавляете, чтобы создать Ldap_Search в nod cn=users,dc=foobar,dc=net с фильтром типа cn=username для атрибута с именем memberOf .

Когда вы вводите ПОИСК в LDAP, вы даете :

  1. DN узла, с которого начинается поиск
  2. Атрибуты, которые вы хотите восстановить
  3. фильтр ((amp;(cn=имя пользователя))
  4. Глубина вашего поиска и здесь это поддерево (не одноуровневое и не базовое)

Комментарии:

1. Во втором решении: $ldapAdapter->getResource() является результатом ldap_connect() ? Значение $BaseDN равно ‘cn=users,dc=foobar,dc=net’ Попробуйте заменить ‘cn=username’ на ‘(cn=username)’ в фильтре

2. Вопрос: Ваш каталог Active Directory?

3. Вы имеете в виду OpenDS или Open Directory реализацию модели службы каталогов LDAP от Apple?

4. Если это открытый каталог от Apple, ищите атрибут с именем ‘member’, а не ‘memberOf’

5. Хорошо, сосредоточьтесь на ldap_search (ресурс $link_identifier , строка $base_dn , строка $filter) забудьте атрибуты (будут восстановлены все). Он должен что-то возвращать, вы уверены в ‘cn=username’?

Ответ №2:

Для всех, кто еще сталкивается с этим, вот решение, с которым я пришел.

 $groups = array();
$attributes = array('cn');
$users = $ldapAdapter->search('(amp;(objectClass=posixGroup)(memberUid='. $form->getValue('username') .'))', 'cn=groups,dc=foobar,dc=net', Zend_Ldap::SEARCH_SCOPE_SUB, $attributes);
foreach ($users as $user) {
    $groups[] = $user['cn'][0];
}
  

Ответ №3:

Я знаю, что речь шла о Zend Framework, но я нашел, как запрашивать группы Zend Ldap Ldap с помощью ZF2

 $ldap = $adapter->getLdap();
$filter = ZendLdapFilter::equals('samaccountname', 'my_username');
$basedn = 'CN=Users,DC=foobar,DC=net';
$attributes = array('memberOf');
$scope = ZendLdapLdap::SEARCH_SCOPE_SUB;

$result = $ldap->search($filter, $basedn, $scope, $attributes);
  

Ответ №4:

Open Directory (реализация OpenLDAP от Apple в OS / X) не имела поддержки memberOf overlay, добавленной во время компиляции. Следовательно, memberOf не будет работать в стандартной системе Mac OS X.

Как выяснил OP, обходной путь потребует реализации коллекции групп и создания членства в группе для каждого пользователя, чтобы достичь того же (или вручную добавлять эту недостающую информацию каждый раз, когда вносятся изменения в хранилище данных LDAP).