Наконец обошлось.Пользовательские 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.