Pregunta

Tenemos una aplicación web JSF que utiliza la seguridad de Acegi. También tenemos una aplicación independiente de Java Swing. Una función de la aplicación Swing es cargar la página de inicio del usuario en una ventana del navegador.

Para hacer esto, actualmente estamos usando Commons HttpClient para autenticar al usuario con la aplicación web:

String url = "http://someUrl/j_acegi_security_check";
HttpClient client = new HttpClient();
System.setProperty(trustStoreType, "Windows-ROOT");
PostMethod  method = new PostMethod(url);
method.addParameter("j_username", "USERNAME");
method.addParameter("j_password", "PASSWORD");
int statusCode = client.executeMethod(method);
if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY ) {
    Header locationHeader= method.getResponseHeader("Location");
    String redirectUrl = locationHeader.getValue();
    BrowserLauncher launcher = new BrowserLauncher();
    launcher.openURLinBrowser(redirectUrl);
}

Esto devuelve una respuesta de redirección HTTP 302, de la cual tomamos la URL de redirección y la abrimos usando BrowserLauncher 2. La URL contiene la nueva ID de sesión, algo así como:

http://someUrl/HomePage.jsf;jsessionid=C4FB2F643CE48AC2DE4A8A4C354033D4

El problema que estamos viendo es que ACEGI procesa la redirección pero lanza una autenticación CredentialSnotFoundException. Parece que por alguna razón las credenciales autenticadas no se pueden encontrar en el contexto de seguridad.

¿Alguien tiene una idea de por qué está sucediendo esto? Si alguien necesita más información, entonces estaré encantado de complacer.

Muchas gracias,

Ricardo

¿Fue útil?

Solución

Nunca he hecho acegi/seguridad de Springs, pero los síntomas son lo suficientemente claros: falta información importante en la solicitud. Al menos necesita investigar todos los encabezados de respuesta si no hay algo nuevo que necesidades para ser devuelto en el encabezado de la solicitud posterior. Tal vez otra entrada de cookies que representa las credenciales de Acegi.

Pero otra advertencia es que de hecho no puede abrir solo la URL en una instancia de navegador local, porque no hay forma de pasar los encabezados de solicitudes necesarios a lo largo de ella. Deberá que su aplicación Swing se actúe como un browser integrado. Por ejemplo, obtener la respuesta HTML en un InputStream y renderizarlo/mostrarlo de alguna manera en un marco de swing. Comprobaría si ya no hay una API existente para eso, porque implicaría mucho más trabajo de lo que inicialmente pensaría ... (subestimación).

Otros consejos

En este caso, puede hacer autenticación básica y establecer este encabezado en cada solicitud en lugar de enviar el jsesionid:

AUTHORIZATION:Basic VVNFUk5BTUU6UEFTU1dPUkQ=

El token Vvnfuk5btuu6ueftu1dpukq = es el nombre de usuario y la contraseña codificada base64.
Ejemplo:

scott:tiger 

es:

c2NvdHQ6dGlnZXI=

Una cosa más: usa SSL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top