Documentación de Microservicio de Usuarios
La capa de entidades contiene las clases mapeadas a las tablas de la base de datos y define los datos persistentes que representan los objetos de negocio. Las entidades principales son UserEntity
, ProjectEntity
, RoleEntity
, TokenEntity
, PermissionEntity
, y UserVerification
. Estas clases se relacionan entre sí para gestionar la información de usuarios, proyectos, roles, permisos, y verificación de usuarios.
- UserEntity: Representa a un usuario en el sistema. Tiene propiedades como
idUsuario
,email
,password
, y booleans de control (isEnabled
,accountNoExpired
, etc.). Cada usuario puede tener uno o más roles (roles
) y pertenecer a varios proyectos (projects
). - ProjectEntity: Representa un proyecto y contiene atributos como
idProyecto
,nombre
,uuid
,fechaCreacion
, ycustomEmail
. Un proyecto puede tener varios usuarios (usuarios
). - RoleEntity: Define los roles que un usuario puede tener, con un campo
nombre
que soporta valoresADMIN
yUSER
. - TokenEntity: Esta entidad gestiona los tokens de autorización con atributos como
status
ytoken
. Cada token se asocia con un proyecto (proyecto
). - PermissionEntity: Almacena los permisos que pueden asignarse a los roles (
rolesPermisos
) y tiene un camponame
. - UserVerification: Se usa para la verificación de usuarios, con campos como
idUserVerification
,code
, ycreationDate
.
Los DTOs facilitan la transferencia de datos entre la capa de servicio y el cliente, encapsulando solo la información necesaria y evitando el uso directo de entidades.
- ProjectAndUsersDTO: Transfiere datos de proyectos junto con su lista de usuarios. Incluye
idProyecto
,nombre
,uuid
,fechaCreacion
,customEmail
, yusuarios
. - ProjectDTO: Similar a
ProjectAndUsersDTO
pero excluye la lista de usuarios. - TokenRequestDTO: Encapsula las entidades
UserEntity
,ProjectEntity
, yTokenEntity
para la creación y verificación de tokens. - UserDetailDto: Proporciona detalles de usuario como
idUsuario
,email
,password
, y campos booleanos de control, junto con el rol del usuario. - UserEntityDTO: DTO simple que contiene
idUsuario
yemail
. - UserLoginRequest: Encapsula la información de inicio de sesión (
email
ypassword
). - UserVerificationDTO: Usado para la verificación de usuarios, con
idUserVerification
,code
, yuser
.
La capa de servicio gestiona la lógica de negocio de la aplicación. Utiliza las entidades y DTOs para realizar operaciones específicas de negocio y para interactuar con los repositorios. A continuación, se describen los servicios principales y sus responsabilidades.
- ProjectService: Gestiona las operaciones relacionadas con los proyectos, como la creación, consulta y eliminación de proyectos.
- Métodos:
saveProject(ProjectEntity projectEntity, Integer idUsuario)
: Guarda un nuevo proyecto en la base de datos y asocia un usuario al proyecto. Genera unUUID
único para el proyecto y establece lafechaCreacion
.projectAndUsers(Integer idProject)
: Busca un proyecto por suidProject
y devuelve los datos junto con la lista de usuarios asociados en unProjectAndUsersDTO
.findProjectEntityByIdProjectEntity(Integer idProject)
: Recupera una entidad de proyecto a partir de su ID.deleteProjectById(Integer idProject)
: Elimina un proyecto de la base de datos por su ID.
- Métodos:
- TokenService: Gestiona la creación, búsqueda y eliminación de tokens de autorización para los proyectos.
- Métodos:
createToken(Integer idProject)
: Crea un nuevo token de acceso para un proyecto específico. Asocia el token generado al proyecto y lo guarda en la base de datos.deleteLogically(TokenEntity tokenEntity)
: Marca un token con el estado "delete" para eliminarlo lógicamente sin eliminarlo físicamente.deletePhysically(Integer idToken)
: Elimina un token de la base de datos de forma permanente usando su ID.findByToken(String token)
: Busca y retorna un token específico en la base de datos.
- Métodos:
- UserDetailServiceImp: Implementa
UserDetailsService
de Spring Security para cargar la información de los usuarios, necesaria para la autenticación.- Método:
loadUserByUsername(String username)
: Carga los detalles del usuario a partir de su correo electrónico (username
). Genera una lista deSimpleGrantedAuthority
para los roles y permisos asociados al usuario, permitiendo que estos datos se utilicen en el contexto de seguridad.
- Método:
- UserService: Gestiona las operaciones relacionadas con los usuarios, como la creación y recuperación de datos de usuarios.
- Métodos:
saveUser(UserEntity userEntity)
: Guarda un nuevo usuario en la base de datos con contraseñas encriptadas y establece valores por defecto para los campos booleanos. Asigna el rolUSER
al usuario.findUserById(Integer id)
: Recupera un usuario por su ID.findAllUsers()
: Retorna una lista de todos los usuarios en la base de datos.findUserByEmail(String email)
: Recupera un usuario por su correo electrónico.
- Métodos:
- VerificationService: Gestiona la verificación de usuarios a través de códigos generados y almacenados temporalmente.
- Métodos:
createVerification(UserEntity user)
: Crea un nuevo código de verificación para un usuario, guarda los detalles en la base de datos y retorna unUserVerificationDTO
.validate(int code, UserVerification userVerification)
: Valida un código de verificación proporcionado y, si es correcto, elimina la entrada de verificación.findUserVerification(Integer code)
: Busca una verificación de usuario usando el código.
- Métodos:
La capa de base de datos define la estructura de la información persistente, incluyendo las tablas y las relaciones entre ellas. A continuación, se describen las tablas principales, sus campos y las relaciones establecidas en la base de datos para esta aplicación.
- Tabla
permisos
: Define los permisos individuales que pueden asignarse a roles.- Campos:
id_permiso
: ID único generado automáticamente.name
: Nombre del permiso, debe ser único.
- Restricciones:
- La columna
name
debe tener valores únicos.
- La columna
- Campos:
- Tabla
proyectos
: Almacena la información básica de los proyectos.- Campos:
id_proyecto
: ID único generado automáticamente.fecha_creacion
: Marca la fecha y hora de creación del proyecto.uuid
: Identificador único para cada proyecto.custom_email
: Correo electrónico personalizado asociado al proyecto.nombre
: Nombre del proyecto.type_of_plan
: Tipo de plan del proyecto.
- Campos:
- Tabla
proyectos_usuarios
: Representa la relación muchos a muchos entreproyectos
yusuarios
, indicando los usuarios asignados a cada proyecto.- Campos:
id_proyecto
: ID del proyecto (relación con la tablaproyectos
).id_usuario
: ID del usuario (relación con la tablausuarios
).
- Restricciones:
- Llave primaria compuesta por
id_proyecto
yid_usuario
. - Clave foránea
id_usuario
referenciada en la tablausuarios
. - Clave foránea
id_proyecto
referenciada en la tablaproyectos
.
- Llave primaria compuesta por
- Campos:
- Tabla
roles
: Define los roles posibles en la aplicación, con una restricción que limita los valores posibles de rol.- Campos:
id_rol
: ID único generado automáticamente.nombre
: Nombre del rol (solo puede tener los valores'ADMIN'
o'USER'
).
- Restricciones:
- Restricción
check
para asegurar quenombre
solo tome los valores'ADMIN'
o'USER'
.
- Restricción
- Campos:
- Tabla
roles_permisos
: Representa la relación muchos a muchos entreroles
ypermisos
, permitiendo asignar múltiples permisos a cada rol.- Campos:
id_permiso
: ID del permiso (relación con la tablapermisos
).id_rol
: ID del rol (relación con la tablaroles
).
- Restricciones:
- Llave primaria compuesta por
id_permiso
yid_rol
. - Clave foránea
id_permiso
referenciada en la tablapermisos
. - Clave foránea
id_rol
referenciada en la tablaroles
.
- Llave primaria compuesta por
- Campos:
- Tabla
tokens
: Almacena los tokens de autorización para cada proyecto.- Campos:
id_proyecto
: ID del proyecto (relación con la tablaproyectos
).id_token
: ID único del token, generado automáticamente.status
: Estado del token (debe ser único).token
: El valor del token, único y necesario para la autenticación.
- Restricciones:
- La columna
status
ytoken
deben ser únicos. - Clave foránea
id_proyecto
referenciada en la tablaproyectos
.
- La columna
- Campos:
- Tabla
usuario_roles
: Representa la relación muchos a muchos entreusuarios
yroles
, indicando los roles asignados a cada usuario.- Campos:
id_rol
: ID del rol (relación con la tablaroles
).id_usuario
: ID del usuario (relación con la tablausuarios
).
- Restricciones:
- Llave primaria compuesta por
id_rol
yid_usuario
. - Clave foránea
id_rol
referenciada en la tablaroles
. - Clave foránea
id_usuario
referenciada en la tablausuarios
.
- Llave primaria compuesta por
- Campos:
- Tabla
usuarios
: Almacena la información básica y de seguridad de cada usuario.- Campos:
account_no_expired
: Booleano que indica si la cuenta del usuario ha expirado.account_no_locket
: Booleano que indica si la cuenta está bloqueada.credential_no_expired
: Booleano que indica si las credenciales han expirado.id_usuario
: ID único del usuario, generado automáticamente.is_enabled
: Booleano que indica si el usuario está habilitado.email
: Dirección de correo electrónico, debe ser única.password
: Contraseña encriptada del usuario.
- Restricciones:
- La columna
email
debe ser única.
- La columna
- Campos:
- Tabla
verificacion
: Almacena la información de verificación de cada usuario.- Campos:
attempts
: Número de intentos realizados por el usuario para verificar su cuenta.code
: Código de verificación del usuario.id_user
: ID del usuario al que pertenece la verificación (relación con la tablausuarios
).id_user_verification
: ID único de la verificación, generado automáticamente.creation_date
: Fecha de creación de la verificación.
- Restricciones:
- La columna
id_user
debe ser única. - Clave foránea
id_user
referenciada en la tablausuarios
.
- La columna
- Campos:
La capa de configuración gestiona las configuraciones de seguridad, autenticación, autorización y CORS de la aplicación. En este caso, se utiliza Spring Security
para implementar la autenticación y autorización, y se configura CORS
para controlar el acceso desde diferentes dominios.
La clase SecurityConfig
define varias configuraciones para la seguridad de la aplicación, utilizando las siguientes anotaciones:
- @Configuration: Declara que esta clase es de configuración y provee beans a Spring.
- @EnableWebSecurity: Habilita la configuración de seguridad web de Spring.
- @EnableMethodSecurity: Permite el uso de anotaciones de seguridad a nivel de método.
- SecurityFilterChain: Configura el filtro de seguridad y controla qué endpoints son accesibles o protegidos.
- Deshabilita CSRF (
csrf.disable()
) para simplificar el manejo de solicitudes, especialmente para aplicaciones REST. - Habilita CORS con la configuración por defecto (
cors(withDefaults())
). - Define la política de sesión como STATELESS, apropiada para aplicaciones REST.
- Configura rutas de acceso y permisos:
"/projects/**"
y"/user/**"
están permitidas para todos los usuarios sin autenticación.http.anyRequest().permitAll()
permite el acceso a otras rutas.
- Deshabilita CSRF (
- CorsConfigurationSource: Configura las reglas de
CORS
para permitir acceso desde múltiples orígenes.- Permite cualquier origen (
"*"
), lo cual es útil en entornos de desarrollo. - Habilita métodos HTTP comunes (
GET
,POST
,PUT
,DELETE
,OPTIONS
). - Configura encabezados permitidos (
"*"
), permitiendo cualquier encabezado en las solicitudes. - Habilita el envío de credenciales si es necesario.
- Permite cualquier origen (
- AuthenticationManager: Este bean facilita la autenticación en la aplicación utilizando la configuración definida en
AuthenticationConfiguration
. - AuthenticationProvider: Configura el proveedor de autenticación para que use
UserDetailsService
yBCryptPasswordEncoder
como cifrador de contraseñas, asegurando que se utilice una capa de seguridad adecuada. - PasswordEncoder: Define el cifrador de contraseñas
BCryptPasswordEncoder
, usado para encriptar y verificar contraseñas de manera segura. Esta configuración permite que los endpoints definidos sean accesibles solo para usuarios autorizados, y los tokens se usan sin necesidad de mantener sesiones en el servidor, ideal para aplicaciones con arquitecturas sin estado.
La capa de controladores se encarga de gestionar las peticiones HTTP, procesar los datos y comunicarse con los servicios de la aplicación para responder con los datos necesarios. A continuación, se presentan los principales controladores, sus rutas y sus funcionalidades.
Este controlador gestiona las peticiones relacionadas con los proyectos, y realiza las operaciones CRUD.
- Endpoints:
POST /projects
: Crea un nuevo proyecto.GET /projects/{idProject}
: Retorna la información de un proyecto y los usuarios asociados.DELETE /projects/{idProject}
: Elimina un proyecto de forma lógica o física.
- Métodos:
saveProject
: Recibe unProjectEntity
y unidUsuario
para asociar el proyecto con un usuario y guardarlo en la base de datos.projectAndUsers
: Recupera la información del proyecto y la lista de usuarios asociados en formato DTO.deleteProject
: Permite la eliminación lógica o física de un proyecto.
Este controlador maneja las solicitudes relacionadas con los usuarios.
- Endpoints:
POST /user
: Crea un nuevo usuario.GET /user/{idUsuario}
: Obtiene los datos de un usuario por ID.GET /user/all
: Devuelve una lista de todos los usuarios registrados.
- Métodos:
saveUser
: Crea un nuevo usuario en la base de datos con sus propiedades de seguridad.findUserById
: Recupera la información de un usuario específico por su ID.findAllUsers
: Recupera todos los usuarios registrados en el sistema.findUserByEmail
: Encuentra un usuario específico por su dirección de correo electrónico.
Este controlador gestiona las peticiones para la generación y manejo de tokens de autorización.
- Endpoints:
POST /tokens
: Genera un nuevo token para un proyecto específico.DELETE /tokens/{idToken}
: Elimina un token por ID de forma lógica o física.
- Métodos:
createToken
: Genera y asocia un nuevo token a un proyecto.deleteLogically
: Cambia el estado del token a "delete" para una eliminación lógica.deletePhysically
: Elimina completamente el token de la base de datos.
Este controlador maneja las solicitudes relacionadas con la verificación de usuarios.
- Endpoints:
POST /verification
: Crea un nuevo código de verificación para un usuario.POST /verification/validate
: Valida el código de verificación de un usuario.
- Métodos:
createVerification
: Genera un código de verificación de cinco dígitos y lo asocia al usuario.validate
: Valida el código ingresado por el usuario y elimina la verificación si es correcta.