我有一个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恢复此主体的所有关联组?有可能吗?
[]中
答案 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
我希望这能帮到你!