2009-12-08 19 views
20

Cuando Spring Security autentica al usuario, crea un objeto UserDetail y está disponible para encontrar UserId actual en la aplicación web. Pero digamos que quiero mantener un objeto de usuario personalizado con preferencias y otros detalles junto con UserDetails o Reemplazar UserDetails.¿Cómo administrar un objeto de usuario personalizado en sesión cuando Spring Security autentica al usuario?

Entonces, ¿cómo agregar el objeto Usuario personalizado a la sesión cuando Spring Security autentica con éxito? Y cómo eliminar un objeto de usuario personalizado de la sesión cuando Spring Security cierra la sesión del usuario conectado.

¿O hay alguna forma adecuada de hacerlo?

+2

¡Me encanta cuando alguien pregunta exactamente qué es lo que quiero preguntar! – Adelin

Respuesta

18

La mejor manera de hacer esto es haciendo que uno de sus servicios (probablemente UserService) implemente UserDetailsService y especifique en el XML de seguridad primaveral que desea usar su propio servicio de detalles de usuario.

Lo que UserDetailsService deberá hacer es implementar un método loadByUsername (String username). Este método deberá devolver una clase que implemente UserDetails. Este puede ser tu propio objeto personalizado almacenando lo que quieras. La ventaja de esto es que puede acceder a las propiedades del objeto desde un JSP a través del taglib de seguridad de primavera y también está siempre disponible desde el singleton SecurityContextHolder (thread safe) en la seguridad de primavera.

aquí hay un enlace a la documentación para esto: spring security manual, chapter 8 Aquí es un post hablando de la implementación de un servicio de datos de usuario personalizados para el cifrado: example usage

espero que esta ayuda

Editar: se olvidó de mencionar que el objeto se eliminará del contexto de seguridad y la sesión al cerrar la sesión. Eso es lo que es más útil al respecto, está totalmente administrado por la seguridad de primavera.

0

Definitivamente tiene que escribir su propio UserDetailService. En el objeto Principal está el usuario y también hay un objeto de Detalles en el AuthenticationToken que puede almacenar un Mapa (Cadena, Cadena) de otra información de inicio de sesión.

public class RequestFormDeatils extends SpringSecurityFilter { 

    protected void doFilterHttp(HttpServletRequest request, ...) { 
     SecurityContext sec = SecurityContextHolder.getContent(); 
     AbstractAuthenticationToken auth = (AbstractAuthenticationToken)sec.getAuthentication(); 
     Map<String, String> m = new HashMap<String, String>; 
     m.put("myCustom1", request.getParameter("myCustom1")); 
     m.put("myCustom2", request.getParameter("myCustom2")); 
     auth.setDetails(m); 
} 

Ahora cualquier parte del código que presentamos lo mejor utilizar el SecurityContext para propagar esta información relacionada con la seguridad sin tener que acoplarlo a su objeto UserDetails, o pasarlo como argumentos. Hago este código en un SecurityFilter al final de la cadena Spring Security Filter.

<bean id="requestFormFilter" class="...RequestFormDetails"> 
    <custom-filter position="LAST" /> 
</bean> 

Esta información será eliminada cuando el usuario es eliminado (como al cerrar la sesión).  

Cuestiones relacionadas