Cómo autenticar manualmente al usuario con Spring Security

1. Información general

En este artículo rápido, nos centraremos en cómo configurar mediante programación un usuario autenticado en Spring Security y Spring MVC.

2. Seguridad de primavera

En pocas palabras, Spring Security contiene la información principal de cada usuario autenticado en un ThreadLocal , representado como un objeto de autenticación .

Para construir y configurar este objeto de autenticación , necesitamos usar el mismo enfoque que Spring Security normalmente usa para construir el objeto en una autenticación estándar.

Para, activemos manualmente la autenticación y luego establezcamos el objeto de Autenticación resultante en el SecurityContext actual utilizado por el marco para contener al usuario actualmente conectado:

UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth);

Después de configurar la autenticación en el contexto, ahora podremos verificar si el usuario actual está autenticado, usando securityContext.getAuthentication (). IsAuthenticated () .

3. Spring MVC

De forma predeterminada, Spring Security agrega un filtro adicional en la cadena de filtros de Spring Security, que es capaz de persistir en el contexto de seguridad ( clase SecurityContextPersistenceFilter ).

A su vez, delega la persistencia del Contexto de seguridad a una instancia de SecurityContextRepository , por defecto en la clase HttpSessionSecurityContextRepository .

Entonces, para configurar la autenticación en la solicitud y, por lo tanto, hacerla disponible para todas las solicitudes posteriores del cliente , debemos configurar manualmente el SecurityContext que contiene la Autenticación en la sesión HTTP:

public void login(HttpServletRequest req, String user, String pass) { UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth); HttpSession session = req.getSession(true); session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc); }

SPRING_SECURITY_CONTEXT_KEY es un HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY importado estáticamente .

Cabe señalar que no podemos usar directamente HttpSessionSecurityContextRepository , porque funciona en conjunto con SecurityContextPersistenceFilter.

Esto se debe a que el filtro usa el repositorio para cargar y almacenar el contexto de seguridad antes y después de la ejecución del resto de filtros definidos en la cadena, pero usa un contenedor personalizado sobre la respuesta que se pasa a la cadena.

Entonces, en este caso, debe conocer el tipo de clase del contenedor utilizado y pasarlo al método de guardado apropiado en el repositorio.

4. Conclusión

En este tutorial rápido, repasamos cómo configurar manualmente la autenticación del usuario en el contexto de Spring Security y cómo puede estar disponible para fines de Spring MVC, centrándonos en las muestras de código que ilustran la forma más sencilla de lograrlo.

Como siempre, los ejemplos de código se pueden encontrar en GitHub.