2010-07-20 11 views
6

En mi aplicación estoy usando autenticación LDAP. Pero también tengo 2 servicios remotos que requieren autenticación a través del método de inicio de sesión (nombre de usuario, contraseña). El método devuelve un token de seguridad que me permite invocar otros métodos, es decir, debería pasar el token de seguridad a los métodos de servicio como primer argumento.
Así que me gustaría obtener estos tokens de seguridad inmediatamente después del inicio de sesión exitoso usando LDAP y almacenarlos en SecurityContext. Traté de usar authentication-success-handler-ref de form-login elemento. Con el controlador reemplazo el objeto Autenticación en SecurityContext con Autenticación personalizada que contiene no solo la contraseña sino también tokens de seguridad. Pero en este caso tengo la excepción de que ningún proveedor de autenticación admite esta clase de token. Sé que también es posible almacenar tokens en la sesión HTTP, pero en este caso tengo que pasar la sesión al objeto de servicio, así que me gustaría almacenar los tokens en SecurityContext.¿Cómo almacenar información personalizada en SecurityContext of spring-security?

¿Cuál es el mejor enfoque para manejar el token de seguridad del servicio?

Respuesta

10

que a menudo utilizan el objeto Authentication.getDetails() para almacenar información adicional que pueden no estar directamente vinculada con el usuario por la opinión. De modo que puede almacenar cualquier objeto que desee en ese campo (un HashMap, por ejemplo) y comparte el ciclo de vida del objeto Authentication.

HashMap<String, Object> info = new HashMap<String, Object>(); 
info.put("extraInfo", "info"); 
auth.setDetails(info); 
... 
Map<String, Object> i = (Map<String, Object>)SecurityContextHolder.getContext().getAuthentication.getDetails(); 
4

Su implementación de 'UserDetails' puede contener datos adicionales. Esto es lo que se almacena en SecurityContext, que luego se puede acceder después de iniciar sesión correctamente.

Más tarde, puede acceder a él como (Asume MyUserDetails implementa DetallesUsuario)

Object principal = SecurityContextHolder.getContext().getAuthentication(); 
if (principal instanceof MyUserDetails) { 
    MyUserDetails mud = (MyUserDetails) principal; 
    mud.getMyData(); //Extract your additional data here 
} 
+0

No estoy seguro de poder utilizar userDetailsSerivce con autenticación LDAP. – viator

+1

No necesita implementar todo el UserDetailsService. Solo puede usar su propia implementación de UserDetails con LDAP. Aquí hay información sobre cómo hacer esto: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/ldap.html#ldap-custom-user-details – Gopi

Cuestiones relacionadas