Creación de Filtro de Seguridad JWT en Spring Security
Clase 20 de 23 • Curso de Java Spring Security: Autenticación y Seguridad Web
Resumen
¿Cómo validar un JSON Web Token (JWT) con Spring Security?
La seguridad es un aspecto crítico en aplicaciones que manejan datos sensibles y operaciones críticas. Una de las tecnologías de seguridad más utilizadas en microservicios es el JSON Web Token (JWT). En este artículo, exploraremos cómo implementar un filtro de seguridad que valide estos tokens utilizando Spring Security. Nuestro enfoque estará en la implementación de un filtro personalizado que evaluará las peticiones y autenticará las solicitudes de manera segura.
¿Cómo crear un filtro personalizado en Spring Security?
La creación de un filtro personalizado que valide JWTs requiere una serie de pasos metódicos. Dentro de nuestro proyecto, se debe seguir un plan estratégico para que el filtro se integre correctamente:
-
Creación de la clase JWTFilter:
- La clase
JWTFilter
se debe alojar dentro del paqueteconfig
y debe estar anotada con@Component
. Esta anotación es esencial para que Spring pueda descubrir e inyectar esta clase durante su ciclo de vida de dependencia.
- La clase
-
Extender la clase para captar las solicitudes:
- Se debe extender de una clase específica de Spring, la
OncePerRequestFilter
. Esto asegura que el métododoFilterInternal
se ejecute con cada solicitud HTTP entrante, permitiendo la captura y evaluación de dichas solicitudes.
- Se debe extender de una clase específica de Spring, la
-
Sobrescribir el método
doFilterInternal
:- Este método es el núcleo donde se gestionará la autenticación. Recibe parámetros como
HttpServletRequest
,HttpServletResponse
yFilterChain
.
- Este método es el núcleo donde se gestionará la autenticación. Recibe parámetros como
¿Cuáles son los pasos para validar un JWT?
La validación de un JWT implica seguir un conjunto estructurado de pasos para asegurar su autenticidad y su relación con un usuario válido.
-
Validar el encabezado de autorización:
- Recuperar el encabezado con
request.getHeader(HttpHeaders.AUTHORIZATION)
. - Comprobar si está presente, no es nulo ni vacío, y si comienza con la cadena "Bearer".
- Si alguna de estas verificaciones falla, la peticion debe dejarse procesar por el resto de la cadena de filtros sin más acciones.
- Recuperar el encabezado con
-
Validar el JWT:
- Extraer el JWT del encabezado.
- Usar el método
isValid
de la claseJWTUtil
para comprobar su validez. Si el token es inválido, el filtro continuará sin marcar el usuario como autenticado.
-
Cargar el usuario del UserDetailService:
- Obtener el nombre de usuario a partir del token válido.
- Buscar este nombre de usuario en el servicio
UserDetailService
, que recupera los detalles del usuario desde una base de datos.
-
Autenticar y cargar al contexto de seguridad:
- Crear un
UsernamePasswordAuthenticationToken
con el nombre de usuario, la contraseña y las autoridades. - Usar el
SecurityContextHolder
para configurar este token como la autenticación actual.
- Crear un
¿Cómo implementar el usuario y contexto de seguridad?
La correcta implementación del usuario y el contexto de seguridad es esencial para permitir que otras partes de la aplicación manejen la autenticación de manera uniforme. Aquí unos pasos críticos:
- Inyección de dependencias:
Inyectar instancias necesarias como
JWTUtil
yUserDetailService
con@Autowired
para gestionarlas a través de Spring.
@Autowired
private JWTUtil jwtUtil;
@Autowired
private UserDetailsService userDetailsService;
- Carga del contexto:
Utilizar
SecurityContextHolder.getContext().setAuthentication(authenticationToken)
para actualizar el contexto de seguridad una vez que el usuario haya pasado todas las validaciones.
¿Qué sigue después de implementar este filtro?
Una vez implementado este filtro de seguridad, el paso siguiente es incluirlo en la cadena de filtros de Spring Security, garantizando que todas las peticiones a recursos seguros pasen por este filtro. Esto asegura que solamente los JWTs válidos y los usuarios autenticados puedan acceder a las operaciones protegidas de la aplicación. Siempre es clave revisar la documentación oficial de Spring Security para mantener las mejores prácticas y actualizaciones en seguridad.
El adentrarse en detalles, manejar excepciones, y una comprensión clara de la configuración de Spring Security son fundamentales para una implementación exitosa. No pierdas la oportunidad de seguir explorando nuevas funcionalidades y mantente siempre al tanto de las mejores prácticas en seguridad.