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

时间:2011-08-04 20:40:21

标签: java ldap weblogic jaas java-ee-5

我有一个weblogic服务器,使用外部LDAP作为身份验证提供程序。 我需要恢复特定用户在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>

登录后我可以使用以下方法恢复Princial:     &lt;%= request.getUserPrincipal()%&gt;

但我现在需要的是从LDAP恢复此主体的所有关联组?有可能吗?

[]中

3 个答案:

答案 0 :(得分:2)

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

如果不直接访问LDAP,您可以做的最好的事情就像

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

如果在创建会话时执行一次,然后使userGroups会话作用域,性能命中率应该不会太差。 (容器可能会在登录时获得所有组。)

答案 1 :(得分: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中的那个。

答案 2 :(得分:1)

我遇到了同样的问题。在google中查找我发现:http://buttso.blogspot.com/2011/06/weblogic-server-listing-groups-of.html

我希望这能帮到你!