En este tema, aprenderemos cómo implementar la autenticación basada en JSON Web Tokens (JWT) en una aplicación Spring Boot. JWT es un estándar abierto que permite la transmisión segura de información entre partes como un objeto JSON. Es ampliamente utilizado para la autenticación y la autorización en aplicaciones web.

Conceptos Clave

  1. JWT (JSON Web Token):

    • Un JWT es un token que consta de tres partes: encabezado, payload y firma.
    • Encabezado: contiene el tipo de token y el algoritmo de cifrado.
    • Payload: contiene las declaraciones (claims), que son afirmaciones sobre una entidad (generalmente, el usuario) y datos adicionales.
    • Firma: asegura que el token no ha sido alterado.
  2. Autenticación vs. Autorización:

    • Autenticación: proceso de verificar la identidad de un usuario.
    • Autorización: proceso de verificar si un usuario autenticado tiene permiso para acceder a un recurso.
  3. Ventajas de JWT:

    • Compacto: fácil de transmitir a través de URL, POST, etc.
    • Autocontenido: contiene toda la información necesaria sobre el usuario.
    • Seguro: utiliza firmas digitales para verificar la integridad.

Implementación de JWT en Spring Boot

Paso 1: Configuración del Proyecto

Asegúrate de tener las siguientes dependencias en tu archivo pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

Paso 2: Creación del Filtro JWT

Crea un filtro que interceptará las solicitudes HTTP para validar el token JWT.

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class JwtRequestFilter extends OncePerRequestFilter {

    private final String SECRET_KEY = "your_secret_key";

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {

        final String authorizationHeader = request.getHeader("Authorization");

        String username = null;
        String jwt = null;

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

        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
            UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
                    username, null, new ArrayList<>());
            usernamePasswordAuthenticationToken
                    .setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
            SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
        }
        chain.doFilter(request, response);
    }

    private String extractUsername(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
        return claims.getSubject();
    }
}

Paso 3: Configuración de Seguridad

Configura Spring Security para usar el filtro JWT.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@EnableWebSecurity
public class SecurityConfigurer extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // Configura el proveedor de autenticación
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http

Curso de Spring Boot

Módulo 1: Introducción a Spring Boot

Módulo 2: Conceptos Básicos de Spring Boot

Módulo 3: Construyendo Servicios Web RESTful

Módulo 4: Acceso a Datos con Spring Boot

Módulo 5: Seguridad en Spring Boot

Módulo 6: Pruebas en Spring Boot

Módulo 7: Funciones Avanzadas de Spring Boot

Módulo 8: Despliegue de Aplicaciones Spring Boot

Módulo 9: Rendimiento y Monitoreo

Módulo 10: Mejores Prácticas y Consejos

© Copyright 2024. Todos los derechos reservados