Un sistema de registro e inicio de sesión es la puerta de entrada a cualquier aplicación. Hacerlo de forma segura no es una opción, es una obligación. En esta guía, te enseñaremos a construir una API REST para la gestión de usuarios en Spring Boot, protegiendo las contraseñas con Spring Security y BCrypt y asegurando la calidad de los datos con validaciones.
Al final de este tutorial, tendrás una base sólida y profesional para manejar la autenticación en tus proyectos.
1. El Modelo de Datos: La Entidad Usuario
Todo comienza con la definición de nuestros datos. La clase Usuario es nuestra entidad JPA, lo que significa que es un reflejo directo de la tabla usuarios en nuestra base de datos.
Usamos anotaciones para definir su comportamiento:
- @Entity: Le dice a Spring que esta clase es una entidad que debe ser mapeada a una tabla.
- @Table(name = "usuarios"): Especifica el nombre exacto de la tabla.
- @Id y @GeneratedValue: Definen la clave primaria y la estrategia para su autogeneración.
- @Column(nullable = false, unique = true): Establece restricciones a nivel de base de datos, como que el email no puede ser nulo y debe ser único.
model/Usuario.java
2. El Contrato de Datos: UsuarioDTO con Validaciones
Nunca debemos exponer nuestras entidades directamente en la API. Para eso, usamos un DTO (Data Transfer Object). Este objeto define qué datos esperamos recibir del cliente y nos permite añadir una capa de validación antes de que los datos lleguen a nuestra lógica de negocio.
- @NotBlank: Asegura que el campo no sea nulo ni esté vacío.
- @Email: Valida que el string tenga un formato de correo electrónico válido.
dto/UsuarioDTO.java
3. La Configuración de Seguridad: BCryptPasswordEncoder
Para manejar las contraseñas de forma segura, nunca las guardamos en texto plano. Usamos un algoritmo de hashing como BCrypt. Spring Security nos facilita esto.
En nuestra clase de configuración, creamos un "Bean" de BCryptPasswordEncoder. Al registrarlo como un Bean, podemos inyectarlo y usar la misma instancia en cualquier parte de nuestra aplicación, como veremos en el servicio.
config/SecurityConfig.java
4. El Puente con la Base de Datos: UsuarioRepository
El repositorio es la interfaz que nos permite realizar operaciones en la base de datos. Al extender de JpaRepository, Spring Data JPA nos proporciona automáticamente métodos como save(), findById(), findAll(), etc.
Además, podemos definir nuestras propias consultas simplemente declarando un método con un nombre específico. Spring es lo suficientemente inteligente como para entender que findByEmail significa "crea una consulta que busque un usuario por su columna de email".
repository/UsuarioRepository.java
5. La Lógica de Negocio: UsuarioService
Aquí reside el corazón de nuestra funcionalidad. El servicio utiliza el repositorio para interactuar con los datos y el codificador para manejar las contraseñas.
- registrarUsuario(UsuarioDTO):
- Verifica que el email no esté ya registrado para evitar duplicados.
- Cifra la contraseña recibida en el DTO usando passwordEncoder.encode().
- Crea un nuevo objeto Usuario y lo guarda en la base de datos.
- validarLogin(email, password):
- Busca al usuario por su email.
- Si existe, usa passwordEncoder.matches() para comparar la contraseña en texto plano que envía el usuario con el hash guardado en la base de datos. Este método es seguro y es la forma correcta de verificar una contraseña.
service/UsuarioService.java
6. Manejo de Errores Centralizado
Para que nuestra API sea robusta, debemos manejar los errores de forma elegante. En lugar de poner bloques try-catch en cada controlador, creamos un manejador de excepciones global.
- @ControllerAdvice: Anotación que permite a una clase compartir lógica (@ExceptionHandler, etc.) a través de múltiples controladores.
- @ExceptionHandler: Define el método que se ejecutará cuando se lance una excepción específica, permitiéndonos devolver un estado HTTP y un mensaje de error claros.
exception/ResourceNotFoundException.java
exception/GlobalExceptionHandler.java
¡Y listo! Siguiendo esta arquitectura, has creado un sistema de autenticación seguro, validado y robusto, siguiendo las mejores prácticas de la industria con Spring Boot.
No hay comentarios.:
Publicar un comentario