feat(roadmap): implementar Sprints 1, 2 y 3 (MVC, Stateless JWT API y Spring Security)

This commit is contained in:
Carlos Tello
2026-09-05 01:46:57 -03:00
parent fa878cb0d5
commit 69b8b7ccef
34 changed files with 1750 additions and 21 deletions
+27
View File
@@ -445,6 +445,33 @@
* Generación de la etiqueta anotada `v1.0.1` a partir de `rc` con notas de versión detalladas.
* Publicación remota en Gitea (`git push gitea v1.0.1`), disponibilizando la primera versión candidata/estable oficial para producción en Proxmox VE LXC con empaquetado de artefactos descargables (`.zip` y `.tar.gz`).
---
## 27. Implementación Integral del Roadmap (Sprints 1, 2 y 3): MVC, Stateless JWT y Spring Security (2026-09-05)
* **Sprint 1: Refactorización MVC & Capa de Servicios (`app/repositories/`, `app/services/`, `app/schemas/`):**
* **Capa de Repositorios:** Creación de `BaseRepository[T]` genérico, `ClassroomRepository` (con filtros de aulas físicas y virtuales), `ReservationRepository` (con detección de solapamiento horario y carga ansiosa `joinedload`), y `UserRepository`.
* **Contratos DTOs (Pydantic v2):** Creación de esquemas tipados de validación: `ClassroomCreateDTO`, `ClassroomUpdateDTO`, `ReservationCreateDTO`, `ReservationUpdateDTO` y `LoginDTO`.
* **Capa de Servicios Desacoplada:** `ClassroomService` (gestión de unicidad por edificio/piso y aforo virtual), `ReservationService` (resolución de conflictos y validación de capacidad), y `UserService` (autenticación y extracción de permisos RBAC).
* **Controladores Delgados:** Refactorización de rutas web delegando validaciones y persistencia a los servicios (`routes/classrooms.py`).
* **Sprint 2: Autenticación Stateless JWT & API Gateway (`app/routes/api/`, `app/utils/jwt_decorators.py`):**
* **Dependencias:** Incorporación de `PyJWT>=2.8.0` y `pydantic>=2.0.0` en [requirements.txt](file:///c:/Workspace/admin-edu-space/requirements.txt).
* **Servicio Criptográfico (`JWTService`):** Implementación del patrón Dual Token (`Access Token` de 15 min con claims RBAC completos + `Refresh Token` de 7 días para renovación silenciosa en cookie `HttpOnly`). Soporte de lista negra de revocación en memoria.
* **Decoradores de Seguridad REST:** `@jwt_required` y `@jwt_role_required` para inspección de cabeceras `Authorization: Bearer <token>`.
* **Endpoints API RESTful (v1):**
* `POST /api/v1/auth/login`: Entrega de par de tokens y perfil de usuario.
* `POST /api/v1/auth/refresh`: Renovación transparente de tokens sin reingreso de credenciales.
* `POST /api/v1/auth/logout`: Revocación del token activo e invalidación de cookies.
* `GET /api/v1/auth/me`: Perfil y matriz de permisos del usuario autenticado.
* `GET /api/v1/classrooms` y `POST /api/v1/classrooms`: Consulta y creación tipada de aulas.
* `GET /api/v1/reservations` y `POST /api/v1/reservations`: Consulta y gestión de reservas con resolución de conflictos.
* **Sprint 3: Seguridad Empresarial "Sprint / Spring Security" (`app/security/`, `AuditLog`):**
* **SecurityFilterChain:** Pipeline centralizado que inyecta cabeceras HTTP de blindaje OWASP (`X-Content-Type-Options: nosniff`, `X-Frame-Options: SAMEORIGIN`, `X-XSS-Protection`, `Strict-Transport-Security`) y Rate Limiting dinámico contra fuerza bruta (15 peticiones/minuto en `/login` y `/api/v1/auth/login`).
* **Seguridad Declarativa a Nivel Método (`@require_permission`):** Decorador que valida granularmente el nivel de acceso ('read', 'read_write', 'admin') tanto en sesiones web como en API JWT.
* **Bitácora Inmutable de Auditoría:** Modelo de persistencia `AuditLog` y servicio `AuditService.log()` con inferencia automática de usuario actuante (JWT/Web) e IP de origen (`X-Forwarded-For`).
* **Batería de Pruebas Automatizadas:**
* Creación de tests unitarios y de integración en `tests/test_services_and_dto.py`, `tests/test_jwt_and_api.py` y `tests/test_security_chain.py` (18/18 pruebas aprobadas).