#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, вы даете :
- DN узла, с которого начинается поиск
- Атрибуты, которые вы хотите восстановить
- фильтр ((amp;(cn=имя пользователя))
- Глубина вашего поиска и здесь это поддерево (не одноуровневое и не базовое)
Комментарии:
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).