使openam / opensso返回角色名称而不是角色通用ID

时间:2012-10-18 09:01:54

标签: authentication openam role opensso

我正在使用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?

2 个答案:

答案 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格式的角色中。

相关问题