Заставить openam/opensso возвращать имя роли вместо универсального идентификатора роли.

Я использую OpenAM 9.5.2 для аутентификации пользователей в приложении. Аутентификация работает хорошо, но у меня возникают проблемы с получением членства пользователей из конечного приложения.

Я определил группу «somegroup» в openam и добавил своего пользователя в эту группу. Теперь в моем приложении я хочу проверить, являются ли аутентифицированные пользователи членами этой группы. Если я тестирую его с помощью:

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.

Итак, мой вопрос: есть ли способ заставить openam использовать «короткое» (т.е. somegroup) имя группы вместо длинного универсального идентификатора?


person morbac    schedule 18.10.2012    source источник


Ответы (2)


Это не ответ, просто одно замечание.

Я провел некоторые исследования в источниках openam, и, кажется, подтверждается, что имя роли, хранящееся в репозитории, заменяется на universalId, когда openam создает запрос. Это выполняется в классе 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;
}
person morbac    schedule 18.10.2012
comment
Я думаю, что это делается только для передачи некоторых данных клиенту, на стороне клиента он, вероятно, реконструирует фиктивный объект AMIdentity, поэтому любой код может вызывать для него методы, такие как getAttributes. (поэтому я бы не считал это основной причиной) - person Peter Major; 19.10.2012

Насколько мне известно, в настоящее время это невозможно с готовым кодом. В случае, если у вас ограниченное количество групп, можно было бы использовать сопоставление привилегированных атрибутов, но если нет, то проблема усложняется.

Вы можете попытаться изменить реализацию 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.

person Peter Major    schedule 19.10.2012
comment
Я попытался изменить агент openam (AmJBossLoginModule, потому что я использую jboss), чтобы преобразовать имя роли, когда их запрашивает сервер приложений. Для своего теста я добавил хитрый код в метод validatePassword(), который удаляет нежелательную часть имени роли (то есть префикс id= и суффикс ,ou=group,dc=opensso,dc=java,dc=net). Затем я перекомпилировал библиотеку agent.jar с измененным классом, и теперь она работает: я получаю короткую версию имени своей роли. Теперь мне нужно найти лучший класс для применения этой модификации, так как я не хочу зависеть от jboss. - person morbac; 19.10.2012