java - example - ¿Cómo administrar un objeto de usuario personalizado en sesión cuando Spring Security autentica al usuario?
spring security tutorial (2)
La mejor manera de hacer este IMO es hacer que uno de sus servicios (probablemente UserService) implemente UserDetailsService y especifique en el XML de seguridad de Spring que desea usar su propio servicio de detalles de usuario.
Lo que deberá hacer UserDetailsService es implementar un método loadByUsername (nombre de usuario de cadena). 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 una JSP a través de taglib de seguridad spring y también está siempre disponible desde el singleton SecurityContextHolder (seguro para subprocesos) en seguridad spring.
Aquí hay un enlace a los documentos para esto: manual de seguridad de spring, capítulo 8 Aquí hay una publicación del blog que habla sobre la implementación de un servicio de detalles de usuario personalizado para el cifrado de contraseñas: ejemplo de uso
Espero que esto ayude
Editar: Olvidé mencionar que el objeto se eliminará del contexto de seguridad y de la sesión al cerrar sesión. Eso es lo que es más útil al respecto, está totalmente administrado por seguridad de Spring.
Cuando Spring Security autentica al usuario, crea un objeto UserDetail y está disponible para encontrar el UserId actual en la aplicación web. Pero digamos que quiero mantener un objeto de usuario personalizado con preferencias y otros detalles junto con Detalles de usuario o Reemplazo de Detalles de usuario.
Entonces, ¿cómo agregar un objeto de usuario personalizado a la sesión cuando Spring Security se autentica correctamente? Y cómo eliminar el objeto de usuario personalizado de la sesión cuando Spring Security cierra la sesión del usuario que ha iniciado sesión.
¿O hay alguna manera apropiada de hacer esto?
Definitivamente necesitas escribir tu propio UserDetailService
. En el objeto Principal está el usuario y también hay un objeto Detalles en el AuthenticationToken
en el 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, en cualquier parte del código que obtenga, use SecurityContext
para propagar esta información relacionada con la seguridad sin tener que UserDetails
a su objeto UserDetails
o pasarla como argumentos. Hago este código en un filtro de SecurityFilter
al final de la cadena del filtro de seguridad de Spring.
<bean id="requestFormFilter" class="...RequestFormDetails">
<custom-filter position="LAST" />
</bean>
Esta información se eliminará cuando se elimine al usuario (como al cerrar sesión).