Finalmente ha funzionato intorno a questo. I documenti personalizzati Principal
possono essere creati in JBoss AS. Basta creare una classe che implementa java.security.Principal
e aggiungere attributi e getter/setter personalizzati.
Poi, durante la configurazione del modulo di login (ad es DatabaseServerLoginModule) un modulo-opzione nel file login-config.xml è sufficiente aggiungere un principalClass
un'opzione:
<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>
...
Ora il problema è che a causa di un bug esistente in JBoss, una chiamata a un iniettato EJBContext.getCallerPrincipal()
non restituirà il Principal personalizzato ma una semplice istanza di SimplePrincipal! Ma la buona notizia è che questo può essere risolto con il seguente codice JAAS che permette l'ispezione di informazioni di autenticazione contenitore 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) {
....
}
ho avvolto il codice di cui sopra in un POJO che posso iniettare nei miei EJB per ottenere il Principalmente come fa la classe EJBContext.
fonte
2011-11-26 00:32:49