Включение пользовательской информации в несколько EJB - PullRequest
5 голосов
/ 25 ноября 2011

С помощью javax.security.Principal вы можете получить информацию о пользователе в любой момент, введя EJBContext с помощью @Resource.

Я пытаюсь добавить дополнительную информацию, относящуюся к моему приложению и моим пользователям, как часть Principal. Я также пытался включить эту информацию в contextData() из EJBContext, но это длится только в течение жизненного цикла EJB, а не в нескольких вызовах EJB.

Есть ли способ расширить Principal, чтобы добавить дополнительную информацию? Я бы предпочел не использовать ThreadLocal или изменять все мои подписи EJB для передачи этой информации.

1 Ответ

1 голос
/ 26 ноября 2011

Наконец обошлось.Пользовательские Principal s могут быть созданы в JBoss AS.Достаточно создать класс, который реализует java.security.Principal и добавить пользовательские атрибуты и методы получения / установки.

Затем при настройке модуля входа в систему (например, DatabaseServerLoginModule) опция модуля в файле login-config.xmlпросто добавьте параметр principalClass:

<application-policy name="my-security-domain">
     <authentication>
     <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
          <module-option name="principalClass">com.custom.security.MyCustomPrincipal</module-option>
...

Теперь проблема заключается в том, что из-за существующей ошибки в JBoss вызов вставленного EJBContext.getCallerPrincipal() не возвратит пользовательский принципал, а простой экземпляр SimplePrincipal!Но хорошая новость заключается в том, что это можно решить с помощью следующего кода JAAS, который позволяет проверять информацию аутентификации контейнера EJB:

try {
      Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container");
      Set<Group> subjectGroups = subject.getPrincipals(Group.class);
      Iterator<Group> iter = subjectGroups.iterator();
      while (iter.hasNext()) {
        Group group = iter.next();
        String name = group.getName();
        if (name.equals("CallerPrincipal")) {
          Enumeration<? extends Principal> members = group.members();
          if (members.hasMoreElements()) {
            context = members.nextElement();
            myCustomPrincipal = (MyCustomPrincipal) context;
          }
        }
      }
    } catch (PolicyContextException e) {
        ....
    }

Я обернул вышеупомянутый код в POJO, который я могу внедрить в свои EJBполучить Принципал так же, как класс EJBContext.

...