java - 遍历 LDAP DIT 的正确方法是什么?

标签 java ldap ldap-query

我是 LDAP 协议(protocol)和服务器的新手,所以如果我问另一个小问题,请原谅我。假设我有以下带有嵌套组的 LDAP DIT。

dn: dc=example,dc=com
objectClass: top
objectClass: domain
dc: example

# Create a place where users are stored
dn: ou=Users, dc=example, dc=com
ou: Users
description: All strongbox users.
objectclass: organizationalUnit

# Create users
dn: uid=tcruise,ou=Users,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
uid: tcruise
cn: Tom Cruise
mail: tcruise@example.com
givenName: Tom
surname: Cruise
userPassword: password

dn: uid=sspielberg,ou=Users,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
uid: sspielberg
cn: Steven Spielberg
mail: sspielberg@example.com
givenName: Steven
surname: Spielberg
userPassword: password

# Create groups
dn: ou=Groups, dc=example, dc=com
ou: Groups
description: Base group organization unit.
objectClass: organizationalUnit

# Employees
dn: ou=Employees, ou=Groups, dc=example, dc=com
ou: Employees
cn: Employees
description: All employees
objectClass: groupOfUniqueNames
uniqueMember: cn=NULL

# Employees (Actors)
dn: ou=Actors, ou=Employees, ou=Groups, dc=example, dc=com
ou: Actors
cn: Actors
description: All actors
objectClass: groupOfUniqueNames
uniqueMember: uid=tcruise,ou=Users,dc=example,dc=com

# Employees (Directors)
dn: ou=Directors, ou=Employees, ou=Groups, dc=example, dc=com
ou: Directors
cn: Directors
description: All directors
objectClass: groupOfUniqueNames
uniqueMember: uid=sspielberg,ou=Users,dc=example,dc=com

示例中的用户可以分配到多个组,每个组都有特定的授权级别。因此,我需要获取用户分配到的所有组及其父组(即tcruise - Actors,Employees)。目前我找不到解决此问题的任何示例。我想到的解决方案是:

  1. 向数据库发送查询,通过执行 (&(objectclass=groupOfUniqueNames)(uniqueMember=uid=sspielberg,ou=Users,dc=example,dc=com))
  2. 解析组dn(即按,分割并删除数组中的第一条记录)
  3. parentGroup objectClass == groupOfUniqueNames时查找父项

尽管这可能有效,但我认为这是不对的。我想知道是否有更好的方法来达到相同的结果?在这种情况下,有什么被认为是最佳实践的东西吗?它可以在大多数 LDAP 服务器实现中发挥作用(AD 除外,因为他们有解决这个问题的方法)?此外,您能否为我提供一个简单的示例代码或包含此问题的可能解决方案的链接?

最佳答案

如果用户是多个组的成员,则应通过组的“uniqueMember”属性中其 DN 的外观在每个组中直接表示该用户。这也适用于家长团体。不要使用类似结构的 DIT 来表达一组组,从而使您的生活变得复杂。因此,您所需要的只是列表中的 (1)。

或者,Employee应该是一组组,其成员应该是Director、Actor等,因此当您检索用户的直接成员身份(例如Actor)时,您可以开始递归操作来查找这些组所属的组,例如 Employee,添加它们,冲洗并重复。这可以用大约五行代码完成。

关于java - 遍历 LDAP DIT 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22133300/

相关文章:

执行查找时 Java LDAP 错误

java - HTTP 状态 405 - 此 URL java servlet 不支持 HTTP 方法 POST

java - 有一个没有抽象方法的抽象类有什么意义呢?

android - 使用带有 SSL 证书文件的 UnboundID SDK 连接到 Android 应用程序中的 LDAP 服务器

java - 在 Java 中连接到 LDAP Active Directory,无需用户名和密码

python - python中的LDAP查询

java - 引入命名参数会破坏 jOOQ 查询

java - 如何在不同应用程序之间通过请求发送对象

c# - 如何使用用户名和密码访问 Active Directory 上的用户文件夹?

java - 使用 Java 命名更改可分辨名称