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.