5. Seguridad - dblancou/ApiLetterboxdProyectoFinal GitHub Wiki

La seguridad es un componente crucial en cualquier aplicación web, y en la API del Proyecto Final se implementa utilizando Spring Security y JWT (JSON Web Tokens). A continuación se detalla la configuración de seguridad y cómo se maneja la autenticación y autorización en la API.

Configuración de Seguridad

La configuración de seguridad de la API se maneja a través de dos clases principales: ApplicationConfig y SecurityConfig. Estas clases configuran los componentes necesarios para la autenticación y la autorización, así como los filtros de seguridad.

ApplicationConfig

La clase ApplicationConfig define los beans necesarios para la autenticación. Esta clase configura un AuthenticationManager, un AuthenticationProvider y un UserDetailsService.

Principales Componentes

  • AuthenticationManager: Gestiona el proceso de autenticación.
  • AuthenticationProvider: Específica el proveedor de autenticación (en este caso, DaoAuthenticationProvider) y el UserDetailsService.
  • UserDetailsService: Carga los detalles del usuario desde el repositorio (UserRepositoryI).
  • PasswordEncoder: Codifica las contraseñas utilizando BCryptPasswordEncoder.

SecurityConfig

La clase SecurityConfig define las políticas de seguridad para la API, incluyendo los filtros y las reglas de autorización.

Principales Componentes

  • JWTAuthenticationFilter: Filtro que intercepta las solicitudes HTTP y valida el token JWT.
  • SecurityFilterChain: Configura las reglas de autorización, deshabilita CSRF (ya que se usan tokens JWT), y establece la política de gestión de sesiones como STATELESS.

Configuración de Endpoints Públicos y Privados

En SecurityConfig, algunos endpoints se configuran como públicos (no requieren autenticación), como los endpoints de autenticación (/auth/) y los endpoints de documentación de la API (/v3/api-docs/, /swagger-ui/). Otros endpoints requieren que el usuario esté autenticado.

Autenticación y Autorización

Autenticación con JWT

La autenticación se maneja mediante JWT. Cuando un usuario se registra o inicia sesión, se genera un token JWT que se devuelve al cliente. Este token debe ser incluido en el encabezado de autorización (Authorization) de cada solicitud subsecuente para acceder a los endpoints protegidos.

Flujo de Autenticación

  • Registro: El usuario envía una solicitud de registro (/auth/register) con un nombre de usuario y una contraseña. La contraseña se codifica y el usuario se guarda en la base de datos. Se genera un token JWT y se devuelve al cliente.
  • Inicio de Sesión: El usuario envía una solicitud de inicio de sesión (/auth/login) con sus credenciales. Si las credenciales son correctas, se genera un token JWT y se devuelve al cliente.
  • Acceso a Endpoints Protegidos: El cliente incluye el token JWT en el encabezado de autorización de las solicitudes a los endpoints protegidos. El JWTAuthenticationFilter valida el token y, si es válido, permite el acceso al endpoint.

Ejemplo de Configuración de Seguridad

A continuación se describe cómo se configuran los componentes de seguridad:

JWTAuthenticationFilter

El JWTAuthenticationFilter intercepta cada solicitud HTTP y realiza las siguientes operaciones:

  • Extrae el token JWT del encabezado de autorización.
  • Valida el token y extrae el nombre de usuario.
  • Carga los detalles del usuario y establece la autenticación en el contexto de seguridad.

SecurityFilterChain

El SecurityFilterChain se configura de la siguiente manera:

  • Deshabilita CSRF (Cross-Site Request Forgery).
  • Permite el acceso público a los endpoints de autenticación y documentación.
  • Requiere autenticación para todos los demás endpoints.
  • Configura la política de gestión de sesiones como STATELESS (no se guarda el estado de la sesión del usuario entre solicitudes).
  • Añade el JWTAuthenticationFilter para interceptar y validar las solicitudes.

Controladores de Seguridad

AuthController

El AuthController gestiona las solicitudes de registro e inicio de sesión. Proporciona los endpoints /auth/register y /auth/login.

Registro de Usuario

  • Endpoint: POST /auth/register
  • Descripción: Permite a los nuevos usuarios registrarse proporcionando un nombre de usuario y una contraseña. La contraseña se codifica antes de guardarse en la base de datos.
  • Respuesta: Devuelve un token JWT que el cliente debe utilizar para autenticarse en solicitudes subsecuentes.

Inicio de Sesión

  • Endpoint: POST /auth/login
  • Descripción: Permite a los usuarios existentes iniciar sesión proporcionando sus credenciales. Si las credenciales son correctas, se genera y devuelve un token JWT.
  • Respuesta: Devuelve un token JWT que el cliente debe utilizar para autenticarse en solicitudes subsecuentes.

Servicios de Seguridad

AuthService

El AuthService maneja la lógica de autenticación y generación de tokens JWT. Implementa los métodos de registro e inicio de sesión.

Métodos Principales

  • register: Registra un nuevo usuario y genera un token JWT.
  • login: Autentica al usuario y genera un token JWT.

JWTService

El JWTService maneja la creación y validación de tokens JWT. Contiene métodos para generar tokens, extraer información de los tokens y validar su validez.

Métodos Principales

  • getToken: Genera un token JWT para un usuario.
  • getUsernameFromToken: Extrae el nombre de usuario de un token JWT.
  • isTokenValid: Valida que un token JWT sea válido y no haya expirado.