我正在使用OpenAM 9.5.2来验证应用程序上的用户。身份验证效果很好,但我遇到了从最终应用程序中获取用户成员身份的问题。
我在openam中定义了“somegroup”组,并将我的用户添加到该组中。现在在我的应用程序中,我想测试经过身份验证的用户是否是该组的成员。如果我用以下方法测试它:
request.isUserInRole("somegroup");
我得到false
结果。实际上,我必须测试
request.isUserInRole("id=somegroup,ou=group,dc=opensso,dc=java,dc=net");
以获得true
回复。
我知道可以在sso代理配置中定义特权属性映射列表以在id=somegroup,ou=group,dc=opensso,dc=java,dc=net
上映射somegroup
,但由于角色和组存储在外部,因此它不适用于我的情况数据库。在sso agent conf中定义数据库中的角色和映射是不方便的。
所以我的问题是:有没有办法让openam使用“短”(即somegroup
)组名而不是它的长通用ID?
答案 0 :(得分:0)
这不是答案,只是一句话。
我在openam源代码中进行了一些研究,似乎确认当openam构建请求时,存储在存储库中的角色名称被universalId替换。这是在com.sun.identity.idm.server.IdRepoJAXRPCObjectImpl.java
class:
public Set getMemberships_idrepo(String token, String type, String name,
String membershipType, String amOrgName,
String amsdkDN
) throws RemoteException, IdRepoException, SSOException {
SSOToken ssoToken = getSSOToken(token);
Set results = new HashSet();
IdType idtype = IdUtils.getType(type);
IdType mtype = IdUtils.getType(membershipType);
Set idSet = idServices.getMemberships(ssoToken, idtype, name, mtype, amOrgName, amsdkDN);
if (idSet != null) {
Iterator it = idSet.iterator();
while (it.hasNext()) {
AMIdentity id = (AMIdentity) it.next();
results.add(IdUtils.getUniversalId(id));
}
}
return results;
}
答案 1 :(得分:0)
据我所知,目前无法使用开箱即用的代码。如果您的组数量有限,那么特权属性映射可能是一种方法,但如果没有,那么问题会变得更复杂。
您可以尝试更改AmRealm实现(authenticateInternal方法)以符合您的要求,并将新类挂钩到特定于容器的ServiceResolver类(如http://sources.forgerock.org/browse/openam/trunk/opensso/products/j2eeagents/tomcat/v6/source/com/sun/identity/agents/tomcat/v6/AmTomcatAgentServiceResolver.java?r=700&r=700&r=700)
您还可以创建有关提供配置属性的JIRA问题,以将成员资格信息放入非UUID格式的角色中。