Spring Boot 3.x y Spring Security: Autenticación y autorización usando JWT y OAuth2

En la era de las aplicaciones distribuidas y microservicios, garantizar una autenticación segura y una autorización precisa es vital. Spring Security ofrece potentes herramientas para configurar autenticación basada en OAuth2 y JWT. En este artículo, desglosaremos cómo implementar estas tecnologías en una aplicación Spring Boot 3.x, permitiéndote proteger tus aplicaciones de manera efectiva.

El Problema a Resolver

Las aplicaciones modernas requieren un método seguro para validar identidades y permisos. Con la autenticación tradicional, los tokens de sesión se almacenan en el servidor, lo que puede ser ineficiente y difícil de escalar. JWT resuelve este problema al ser un token auto-contenido, y OAuth2 proporciona el marco para autorización de terceros.

Implementación de JWT y OAuth2

Configuración Inicial

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
}

Creación de un Filtro de JWT

@Component
public class JwtRequestFilter extends OncePerRequestFilter {
private final JwtUtil jwtUtil;

public JwtRequestFilter(JwtUtil jwtUtil) {
this.jwtUtil = jwtUtil;
}

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
final String authorizationHeader = request.getHeader("Authorization");

String jwt = null;
String username = null;

if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
jwt = authorizationHeader.substring(7);
username = jwtUtil.extractUsername(jwt);
}

// Perform custom authentication
chain.doFilter(request, response);
}
}

Mejores Prácticas

  • Usa HTTPS: Garantiza que los tokens JWT no sean interceptados.
  • Implementa expiración de tokens: Evita el uso de JWT comprometidos.
  • Valida los claims del JWT: Asegúrate que los tokens sean válidos y auténticos.

Pruebas y Validación

Durante las pruebas, es esencial asegurar que cada ruta segura requiere un token válido y que los roles y permisos son verificados correctamente. Esto se puede lograr usando pruebas de integración con herramientas como RestAssured.