如何获取特定用户的所有LDAP组?

4
我是一名有用的助手,可以为您翻译文本。
我有一个使用外部LDAP作为身份验证提供程序的Weblogic服务器。 然后,我需要在LDAP存储库中检索特定用户关联的组。
登录使用标准的Java符号:
<form method="POST" action="j_security_check">
<p>Username: <input type="text" name="j_username"/></p>
<p>Password: <input type="password" name="j_password"/></p>
<input type="submit" value="Login"/>
</form>

登录后,我可以使用以下代码获取Principal: <%= request.getUserPrincipal() %>

但现在我需要从LDAP中检索此Principal的所有关联组。这可能吗?

[]s

3个回答

2

如果不使用LDAP,可能无法获取所有组的列表。通常,JAAS API提供了一种方法来询问用户是否属于某个特定的组,但是无法一次性获取所有组。

如果不直接访问LDAP,您可能能够做到的最好的事情类似于:

for (String group : allGroups) { 
  if (request.isUserInRole(group)) { 
    userGroups.add(group);
  }
}

如果在会话创建时进行一次操作并将用户组设置为会话范围,性能损失应该不会太大。 (容器可能会在登录时获取所有组。)

嗨,经过一段时间的研究,我同意你的观点。我的最终解决方案实际上需要使用request.isUserInRole,并且解决此问题的解决方法需要我使用专有的内部weblogic类来获取所需的组。 - groo
哦,补充一下,但实际上在成功使用标准表单方法登录后,我并不需要循环遍历所有组,只需检查request.isUserInRole即可解决我的问题。 - groo

1

可能有很多答案。一个可能的答案是使用主体构建基本DN,使用base范围查询目录服务器,过滤器为'(&)'并请求isMemberOf属性。例如,在我的测试系统上,使用现代的ldapsearch命令行工具和主体user.0

ldapsearch --hostname localhost --port 1389 \
    --bindDN 'cn=directory manager' --baseDn \
    'uid=user.0,ou=people,dc=example,dc=com' \
    --searchScope base '(&)' isMemberOf
Password for user 'cn=directory manager':
dn: uid=user.0,ou=people,dc=example,dc=com
isMemberOf: cn=shadow entries,ou=groups,dc=example,dc=com
isMemberOf: cn=persons,ou=groups,dc=example,dc=com

这个方法需要了解namingContext,在这种情况下是dc=example,dc=com,以及用户在树中的位置。另一种类似的方法是当不知道用户位置时,首先搜索用户,然后使用搜索结果中的区别名称执行上述查询。如果不知道namingContext,可能可以从根DSE中发现namingContext。要从根DSE中恢复namingContext,请参见此article

有一些广泛使用的目录服务器不正确地支持LDAP标准,并且将拒绝过滤器'(&)',如果您的目录服务器是其中之一,则只需替换存在过滤器'(objectClass=*)'。有许多Java的LDAP SDK,我喜欢的是来自UnboundID的SDK。


嗨Terry,但在我的理解中,这将需要直接访问ldap服务器,我的观点是使用JAAS API查询LDAP。有什么想法吗? - groo

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接