Creación de Filtro de Seguridad JWT en Spring Security

Clase 20 de 23Curso 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:

  1. Creación de la clase JWTFilter:

    • La clase JWTFilter se debe alojar dentro del paquete config 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.
  2. Extender la clase para captar las solicitudes:

    • Se debe extender de una clase específica de Spring, la OncePerRequestFilter. Esto asegura que el método doFilterInternal se ejecute con cada solicitud HTTP entrante, permitiendo la captura y evaluación de dichas solicitudes.
  3. Sobrescribir el método doFilterInternal:

    • Este método es el núcleo donde se gestionará la autenticación. Recibe parámetros como HttpServletRequest, HttpServletResponse y FilterChain.

¿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.

  1. 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.
  2. Validar el JWT:

    • Extraer el JWT del encabezado.
    • Usar el método isValid de la clase JWTUtil para comprobar su validez. Si el token es inválido, el filtro continuará sin marcar el usuario como autenticado.
  3. 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.
  4. 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.

¿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 y UserDetailService 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.