Capítulo II: Arquitectura, Diagramas y Diseño de Software
Este documento describe detalladamente el diseño del sistema, los flujos de datos y las decisiones tecnológicas que impulsan el funcionamiento del ecosistema TVAPyMM.
🏛️ Arquitectura del Sistema
TVAPyMM opera bajo un diseño cliente-servidor completamente desacoplado. El frontend es una Single Page Application (SPA) enfocada en la visualización interactiva del panel de control, mientras que el backend consiste en una API REST sin estado (stateless) encargada de las orquestaciones, los análisis de seguridad y la persistencia de datos.
🔐 Flujo de Autenticación y Auto-aprovisionamiento
TVAPyMM emplea un esquema de seguridad basado en tokens de autenticación sin estado (stateless JWT). Toda la seguridad e interceptación de recursos es gestionada por Spring Security, actuando bajo el rol de Servidor de Recursos OAuth2.
El Ciclo de Auto-aprovisionamiento Dinámico
Para eliminar fricciones en el registro de usuarios, la plataforma implementa un ciclo automático de creación de perfiles:
- El usuario inicia sesión en la interfaz web de React a través del portal de inicio de sesión único de Auth0.
- Auth0 emite y firma un token JWT que contiene los datos del usuario (como el ID único
sub, elemaily elname). - El frontend almacena el JWT y lo adjunta en la cabecera
Authorization: Bearer <token>en cada solicitud HTTP hacia el backend. - Al cargarse por primera vez, el frontend realiza una petición a
GET /users/me. - El backend:
- Descarga las claves públicas del emisor y valida que la firma sea legítima, que pertenezca a la audiencia configurada (
AUTH0_AUDIENCE) y que el emisor coincida (AUTH0_ISSUER_URI). - Extrae los campos
sub(ID de usuario de Auth0),nameyemaildel payload. - Consulta en PostgreSQL si existe un registro de la tabla
Usercon ese identificador. - Si el usuario no existe en la base de datos local, se crea automáticamente un nuevo registro y se le asigna un UUID interno.
- Descarga las claves públicas del emisor y valida que la firma sea legítima, que pertenezca a la audiencia configurada (
- A partir de ese momento, todas las entidades creadas (proyectos, reportes, vulnerabilidades) se asocian al UUID interno generado, garantizando un aislamiento de datos absoluto.
Todos los endpoints de la API (a excepción de los expuestos bajo /public/**) están protegidos. El backend realiza verificaciones estrictas de pertenencia: ningún usuario puede leer, modificar, escanear o eliminar proyectos o datos que no pertenezcan a su UUID local de usuario.
🗄️ Modelo de Datos y Entidades
La capa de persistencia utiliza Spring Data JPA sobre una base de datos relacional PostgreSQL. A continuación se detalla el diagrama entidad-relación principal:
🪣 Diseño de Almacenamiento: Oracle Cloud vs. Servidor Local
Cada análisis genera un reporte en formato Markdown que consolida el estado de seguridad de los proyectos web analizados. TVAPyMM cuenta con dos opciones para gestionar estos archivos, configurables dinámicamente con variables de entorno en application.properties:
1. Modo Producción: Oracle Cloud Infrastructure (OCI) Object Storage
- Antecedentes: En las etapas iniciales de la tesis, el portal utilizaba AWS S3. Sin embargo, para capitalizar los beneficios de infraestructura y la capa gratuita permanente (Always Free tier) de Oracle, la plataforma se migró por completo a servidores e infraestructura de Oracle Cloud. El backend aprovecha la API compatible con S3 provista por Oracle Cloud Object Storage, lo que permite reutilizar librerías cliente estándares.
- Proceso: Al finalizar el escaneo,
MarkdownReportGeneratorescribe el archivo y el servicio de almacenamiento (compatible con API S3) lo sube directamente al bucket privado de Oracle Cloud empleando una ruta estructurada:reports/{projectId}/{reportId}.md. - Guardado: La base de datos guarda únicamente la clave o ruta del archivo (
reportUrl), evitando almacenar URLs completas. - Descarga: Dado que los archivos en el bucket de Oracle Cloud son privados, cuando el usuario solicita descargar un reporte mediante
GET /reports/{id}, el backend calcula una URL temporal prefirmada con validez de 7 días. El frontend simplemente redirige al navegador a ese enlace de descarga directo y seguro.
2. Modo Fallback (Desarrollo Local)
- Proceso: Al activar el parámetro de entorno
APP_REPORTS_LOCAL_STORAGE=true, se ignora toda la configuración de la nube. - Guardado: Los archivos Markdown se graban de manera directa en el almacenamiento del sistema operativo del servidor bajo la ruta definida en
app.reports.local-path(por defecto./reports). - Utilidad: Esta modalidad es sumamente conveniente para trabajar sin conexión a Internet o realizar pruebas unitarias rápidas locales.