2011-08-04 194 views
4

我有一个使用外部LDAP作为提供程序进行身份验证的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: <%= request.getUserPrincipal()%>

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

[] s

回答

2

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

您可以无需访问LDAP做的最好的是直接像

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

,如果你做一次会话建立,然后进行群组会话范围的性能影响应该不会太糟糕。 (容器可能会在登录时获得所有组。)

+0

嗨,经过一段时间的研究,我确实同意你的看法。我对这个问题的最终解决方案实际上不得不使用request.isUserInRole和解决方法来让组织要求我使用专有的内部weblogic类。 –

+0

哦,补充,但我实际上并没有必须在成功登录后使用标准Form mehtod循环遍历所有组,我只能检查请求。isUserInRole来解决我的问题。 –

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

+0

嗨特里,但在我的理解这将需要直接访问ldap服务器,我的观点将使用JAAS API来查询LDAP。有任何想法吗? –

相关问题