Mi compañía ha estado evaluando Spring MVC para determinar si deberíamos usarlo en uno de nuestros próximos proyectos. Hasta ahora me encanta lo que he visto, y ahora estoy echando un vistazo al módulo Spring Security para determinar si es algo que podemos / debemos usar.
Nuestros requisitos de seguridad son bastante básicos; un usuario solo necesita poder proporcionar un nombre de usuario y una contraseña para poder acceder a ciertas partes del sitio (como para obtener información sobre su cuenta); y hay un puñado de páginas en el sitio (preguntas frecuentes, soporte, etc.) donde se debe dar acceso a un usuario anónimo.
En el prototipo que he estado creando, he estado almacenando un objeto "LoginCredentials" (que solo contiene nombre de usuario y contraseña) en Session para un usuario autenticado; algunos de los controladores verifican si este objeto está en sesión para obtener una referencia al nombre de usuario conectado, por ejemplo. Estoy buscando reemplazar esta lógica local con Spring Security, que tendría el beneficio de eliminar cualquier tipo de "¿cómo rastreamos a los usuarios registrados?" y "¿cómo autenticamos a los usuarios?" de mi controlador / código comercial.
Parece que Spring Security proporciona un objeto "contextual" (por subproceso) para poder acceder al nombre de usuario / información principal desde cualquier lugar de su aplicación ...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
... que parece muy poco primaveral ya que este objeto es un singleton (global), en cierto modo.
Mi pregunta es esta: si esta es la forma estándar de acceder a la información sobre el usuario autenticado en Spring Security, ¿cuál es la forma aceptada de inyectar un objeto de autenticación en SecurityContext para que esté disponible para mis pruebas unitarias cuando las pruebas unitarias requieren un usuario autenticado?
¿Necesito conectar esto en el método de inicialización de cada caso de prueba?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
Esto parece demasiado detallado. hay una manera mas facil?
El SecurityContextHolder
objeto en sí parece muy poco parecido a Spring ...