0

大家好,

我在获取一个组内的所有用户时遇到问题。我有组名,我的任务是获取所有用户的列表。我没有在 OpenLDAP 服务器中启用memberOf属性。到目前为止,我能够让该组使用:

 "(&(objectClass=groupOfNames)(cn=" + groupName + "))";

当我得到这个时,我使用了找到的组的属性成员,例如“cn=ldapuser1,ou=Users,dc=example,dc=com”

然后,我做了另一个查询来获取所有具有给定名称的用户(在上面的示例中,名称将是 ldapuser1)。我使用这个查询:

"(&(objectClass=inetOrgPerson)(|" + builder + "))"; // it can contain several names

问题是如果我的主要组包含另一个组......我的第二个查询将不起作用。

所以现在可行的是:(但不是那么简单和容易)获取一个组的用户(需要对服务器进行 2 次调用 - 首先获取组,然后根据成员属性我进行第二次查询,要求特定用户)

不起作用的是,例如,如果一个组包含一个用户,而一个组例如包含 2 个用户,那么在我当前的解决方案的最终结果中,我只有一个用户。我想要的是在这个例子中拥有三个用户。

我已经在使用 Active Directory 用户搜索,它非常简单 - 我只使用 memberOf 和“1.2.840.113556.1.4.1941”过滤器来过滤嵌套组及其用户。为什么 OpenLDAP 不能这么简单?

所以我的最后一个问题是实现这一点的最佳方法是什么,如何构建这种查询?

真的很想听听大家的建议

任何帮助,将不胜感激!

非常感谢,

干杯

4

1 回答 1

2

为什么 OpenLDAP 不能这么简单?

“1.2.840.113556.1.4.1941”(又名LDAP_MATCHING_RULE_IN_CHAIN)是一个可扩展匹配运算符,它将对象中的祖先链一直遍历到根,直到找到匹配项,据我所知,仅适用于 Microsoft活动目录。

当然,您可以编写代码来评估每个返回的 memberOf 值以确定它是否是一个组,然后遍历每个组。

我的一个朋友曾经说过“复杂性既不能被创造也不能被摧毁,只能移动”。嵌套组是这类复杂性问题之一。在客户端或服务器上执行此操作,但它仍然很复杂且资源密集。

嵌套组是一个复杂的问题,即使使用“1.2.840.113556.1.4.1941”的 Microsoft Active Directory 也会在大型组嵌套和/或大量成员上失败。我建议避免使用嵌套组。

于 2020-07-18T10:18:07.410 回答