Sto testando la propagazione di JAAS Subject con un custom Principal da un client EJB autonomo in esecuzione su un runtime Java non elaborato su un server JavaEE. Ho come target sia le implementazioni di JBoss che quelle di WebSphere.Come propagare JAAS Subject quando si chiama un EJB remoto (RMI su IIOP) da un client puro
Secondo this forum thread mi aspettavo che avrebbe funzionato facilmente con JBoss.
Ecco il mio EJB client di codice frammento di codice:
Subject subject = new Subject();
Principal myPrincipal = new MyPrincipal("me I myself");
subject.getPrincipals().add(myPrincipal);
PrivilegedExceptionAction<String> action = new PrivilegedExceptionAction<String>() {
public String run() throws Exception {
String result;
System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext()));
InitialContext ic = new InitialContext();
Business1 b = (Business1) ic.lookup("StatelessBusiness1");
result = b.getNewMessage("Hello World");
return result;
}
};
result = subject.doAs(subject, action);
System.out.println("result "+result);
codice lato server è:
public String getNewMessage(String msg) {
System.out.println("getNewMessage principal: " + sessionContext.getCallerPrincipal());
System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext()));
return "getNewMessage: " + msg;
}
A dire il vero, anche se è il comportamento di default, ho aggiunto questa sezione al mio ejb-jar.xml
session bean:
<security-identity>
<use-caller-identity/>
</security-identity>
mio session bean non è protetto da un y ruolo.
In base a this IBM WebSphere infocenter section, ho anche abilitato la proprietà di sistema com.ibm.CSI.rmiOutboundPropagationEnabled=true
.
Tecnicamente parlando, la chiamata di servizio funziona correttamente su JBoss o WebSphere. Ma l'oggetto JAAS che include il mio principal personalizzato creato sul client non viene propagato al server. Ovviamente, lo Subject
scaricato prima della creazione del contesto JNDI e della chiamata EJB è OK.
corro la stessa versione runtime Java per server e client (IBM java6 SR9 FP2 ...), MyPrincipal
classe serializzabile è disponibile nel classpath del server (AppServer/lib/ext
per WebSphere, server/default/lib
per JBoss)
WebSphere discariche:
[8/31/12 11:56:26:514 CEST] 00000024 SystemOut O getNewMessage principal: UNAUTHENTICATED
[8/31/12 11:56:26:515 CEST] 00000024 SystemOut O Current Subject: null
JBoss discariche:
12:30:20,540 INFO [STDOUT] getNewMessage principal: anonymous
12:30:20,540 INFO [STDOUT] Current Subject: null
di sicuro, ho perso una sorta di s magici Pell. Sai quale?
Quindi? Ho già scritto con successo un LoginModule personalizzato per il supporto di WebSphere e Tivoli PDPrincipal, ho configurato LoginModule in JBoss per abilitare Kerberos SPNEGO su HTTP ... Sicuramente mi trovo a mio agio con JAAS e altre cose in giro. Chiedo solo se ho sbagliato pensando che dovrebbe funzionare ... prima di aprire il codice sorgente JBoss per verificare –
Allora sei più esperto di me;) (Ho giocato con LoginModules, autenticazione personalizzata, inoltro principale su RMI-IIOP/CORBA in Glassfish 2.x, e questo è sempre stato molto complicato. In definitiva, l'abbiamo gestito a livello di applicazione da solo) scoraggeremo qualsiasi forma usando questi standard per l'autenticazione username/password. Se il punto è quello di integrare con Kerberos e fornire il single sign-on, questo potrebbe essere ancora il modo migliore per andare! Scusa, non posso aiutare di più. – ewernli
Se di fatto, l'obiettivo è di non riuscire a utilizzare Kerberos con WebSphere nel nostro specifico contesto: http://stackoverflow.com/questions/10518057/how-to-enable-kerberos-authentication-for-remote-ejb- call-on-websphere –