使用Zend_Ldap命令查询用户的所有组


Query all groups of a user using Zend_Ldap

我没有太多要展示的内容,因为我对ldap (Open Directory)一点也不熟悉,而且我在理解如何实际查询特定用户的组时遇到了一点麻烦。使用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

我有正在进行身份验证的帐户,但是现在我需要检索该用户所属组的列表。一般来说,我不会在没有尝试的情况下寻求帮助,但我甚至无法做到这一点。如有任何帮助,不胜感激。

如果我的问题不是很明显:如何查询特定用户的所有组?

===== EDIT =====

根据建议,这是我最近的一次尝试:

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

返回空数组。如能提供进一步的指导,不胜感激。

===== EDIT 2 =====

所以我试图完全删除Zend_Ldap,这样我就可以更容易地测试事情,这是我最终得到的结果在数组('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);

您只需添加Ldap_Search在节点cn=users,dc=foobar,dc=net中使用过滤器,如cn=username,用于名为memberOf的属性。

当你在LDAP中写SEARCH时,你给:

  1. 开始搜索的节点DN
  2. 要检索的属性
  3. 过滤器((&(cn=username))
  4. 搜索的深度,这里是子树(不是OneLevel,也不是base)

对于遇到这种情况的人,这是我想出的解决方案。

$groups = array();
$attributes = array('cn');
$users = $ldapAdapter->search('(&(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];
}

我知道这是关于Zend框架,但我已经找到了如何查询组Zend'Ldap'Ldap与ZF2

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

Open Directory(苹果在OS/X上实现的OpenLDAP)在编译时没有添加memberOf覆盖支持。因此,memberOf不能在标准的Mac OS X系统上工作。

正如OP所发现的那样,解决方案需要实现组集合并构建每个用户的组成员关系来实现相同的目标(或者在每次更改LDAP数据存储时手动添加这些缺失的信息)。