1

我正在使用 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=netsomegroup但它不适合我的情况,因为角色和组存储在外部数据库中。在 sso agent conf 中定义数据库中的角色和映射并不方便。

所以我的问题是:有没有办法让 openam 使用“短”(即somegroup)组名而不是它的长通用 id?

4

2 回答 2

0

这不是一个答案,只是一个评论。

我已经在 openam 源代码中进行了一些研究,并且似乎确认当 openam 构建请求时存储在存储库中的角色名称被替换为universalId。这是在com.sun.identity.idm.server.IdRepoJAXRPCObjectImpl.java课堂上进行的:

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;
}
于 2012-10-18T15:21:00.137 回答
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 )

您还可以创建一个关于提供配置属性以将成员身份信息以非 UUID 格式放入角色的 JIRA 问题。

于 2012-10-19T06:33:07.707 回答