Estoy probando la propagación de JAAS Subject con un custom Principal desde un cliente EJB independiente que se ejecuta en un servidor Java Java en tiempo de ejecución sin procesar. Me estoy enfocando en las implementaciones de JBoss y WebSphere.Cómo propagar el sujeto JAAS al llamar a un EJB remoto (RMI sobre IIOP) desde un cliente puro
Según this forum thread esperaba que funcionara con JBoss fácilmente.
Aquí es mi EJB código de código de cliente fragmento:
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);
código del lado del servidor es:
public String getNewMessage(String msg) {
System.out.println("getNewMessage principal: " + sessionContext.getCallerPrincipal());
System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext()));
return "getNewMessage: " + msg;
}
Para estar seguros, incluso si es el comportamiento por defecto, he añadido esta sección a mi ejb-jar.xml
bean de sesión:
<security-identity>
<use-caller-identity/>
</security-identity>
mi bean de sesión no está protegido por una y rol
De acuerdo con this IBM WebSphere infocenter section, también he habilitado la propiedad del sistema com.ibm.CSI.rmiOutboundPropagationEnabled=true
.
Técnicamente hablando, la llamada de servicio funciona correctamente en JBoss o WebSphere. Pero el Sujeto JAAS que incluye mi principal personalizado creado en el cliente no se propaga al servidor. O por supuesto, el Subject
volcado justo antes de la creación del contexto JNDI y la llamada EJB está bien.
que ejecuta la misma versión de tiempo de ejecución Java para servidor y el cliente (IBM java6 SR9 FP2 ...), MyPrincipal
clase serializable está disponible en ClassPath servidor (AppServer/lib/ext
para WebSphere, server/default/lib
para JBoss)
WebSphere vertederos:
[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 vertederos:
12:30:20,540 INFO [STDOUT] getNewMessage principal: anonymous
12:30:20,540 INFO [STDOUT] Current Subject: null
Por supuesto, me he perdido algún tipo de s mágicas pell. Sabes cuál ?
Así? Ya he escrito con éxito un LoginModule personalizado para soporte de WebSphere y Tivoli PDPrincipal, he configurado LoginModule en JBoss para habilitar Kerberos SPNEGO sobre HTTP ... Definitivamente estoy cómodo con JAAS y otras cosas. Solo pregunto si me equivoco al pensar que debería funcionar ... antes de abrir el código fuente de JBoss para verificar –
Entonces tienes más experiencia que yo;) (Jugué con LoginModules, autenticación personalizada, reenvío del principal sobre RMI-IIOP/CORBA en Glassfish 2.x, y eso siempre ha sido muy complicado. En última instancia, lo manejamos nosotros mismos a nivel de aplicación) Desanimaría a cualquier persona que use estos estándares para la autenticación de nombre de usuario/contraseña. Si el objetivo es integrar Kerberos y proporcionar un inicio de sesión único, ¡esa podría ser la mejor manera de hacerlo! Lo siento, no puedo ayudar más. – ewernli
De hecho, el objetivo es evitar el uso de Kerberos con WebSphere en nuestro contexto específico: http://stackoverflow.com/questions/10518057/how-to-enable-kerberos-authentication-for-remote-ejb- call-on-websphere –