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>

登录后,我可以使用以下方法恢复主体: <%= request.getUserPrincipal() %>

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

[]s

4

3 回答 3

2

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

在不直接访问 LDAP 的情况下,您可以做的最好的事情是

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

如果您在创建会话时执行一次,然后将 userGroups 设置为会话范围,那么对性能的影响应该不会太差。(容器很可能会在登录时获取所有组。)

于 2011-08-15T01:50:53.210 回答
1

我有同样的问题。在谷歌中我发现了这个:http ://buttso.blogspot.com/2011/06/weblogic-server-listing-groups-of.html

我希望这对你有帮助!

于 2013-08-26T23:48:25.977 回答
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不知道,则可以namingContext从根 DSE 发现 。namingContext要从根 DSE恢复,请参阅本文

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

于 2011-08-05T00:21:42.440 回答