2011-11-24 8 views
5

Con javax.security.Principal è possibile recuperare le informazioni dell'utente in qualsiasi momento immettendo EJBContext con @Resource.Spanning di informazioni utente su più EJB

Quello che sto cercando di fare è aggiungere informazioni aggiuntive che sarebbero specifiche per la mia applicazione e per i miei utenti come parte dello Principal. Ho anche provato a includere queste informazioni nello contextData() dello EJBContext, ma questo dura solo per il ciclo di vita EJB piuttosto che in più chiamate EJB.

Esiste un modo per estendere lo Principal per aggiungere ulteriori informazioni? Preferirei non utilizzare ThreadLocal o modificare la firma di tutti i miei EJB per passare queste informazioni.

risposta

1

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.