feat(middleware): add smart public route matching with extension detection

This commit is contained in:
2026-04-29 22:56:08 +02:00
committed by ForgeCode
parent cbf65dfde7
commit db7b26864b
2 changed files with 254 additions and 1 deletions
@@ -0,0 +1,76 @@
# Plan: Mejora de Public Routes en JWT Middleware
## Objective
Modificar la lógica de verificación de rutas públicas en el JWT middleware para que:
- Si el path tiene extensión de archivo → hacer match exacto del archivo
- Si el path NO tiene extensión → hacer match por prefijo (permitir todo bajo esa ruta)
## Implementation Plan
### Análisis del código actual
El código en `src/middleware/jwt.rs:56` hace:
```rust
let is_public_path = self.public_routes.contains(&req.uri().path().to_string());
```
Esto hace un match exacto, lo cual es limitante.
### Modificaciones requeridas
### Modificaciones requeridas:
- [x] Modificar la función `is_public_path` para detectar si la ruta tiene extensión de archivo
- [x] Si tiene extensión → usar match exacto (comportamiento actual)
- [x] Si NO tiene extensión → usar match por prefijo (permitir `/static/*` automáticamente)
- [x] Agregar helper function para detectar extensiones de archivo comunes
### Lógica de verificación propuesta
```
Para cada public_route en public_routes:
1. Obtener el path de la request
2. Si public_route tiene extensión de archivo:
- Comparar exactamente (path == public_route)
3. Si public_route NO tiene extensión:
- Comparar si path EMPIEZA con public_route + "/"
```
### Ejemplos de comportamiento
| public_route | request_path | resultado |
|--------------|--------------|-----------|
| `/static/logo.png` | `/static/logo.png` | ✓ público |
| `/static/logo.png` | `/static/other.png` | ✗ requiere auth |
| `/static` | `/static/file.js` | ✓ público |
| `/static` | `/static/css/style.css` | ✓ público |
| `/static` | `/static` | ✓ público |
| `/api` | `/api/users` | ✓ público |
### Extensiones válidas a considerar
Extensions comunes: `.html`, `.js`, `.css`, `.json`, `.png`, `.jpg`, `.jpeg`, `.gif`, `.svg`, `.ico`, `.woff`, `.woff2`, `.ttf`, `.eot`, `.txt`, `.xml`, `.csv`, `.webp`
## Verification Criteria
- [x] Requests a archivos exactos (con extensión) requieren match completo
- [x] Requests a directorios/rutas (sin extensión) permiten todos los subpaths
- [x] El código mantiene backward compatibility con configs existentes
- [x] La lógica es eficiente (no itera innecesariamente)
- [x] Tests unitarios verifican todos los casos de uso
## Potential Risks
1. **Breaking change**: Si alguien configuró `public_routes: ["/static/file.js"]` esperando que también permita otros archivos, ahora solo permitirá ese archivo específico
- Mitigation: Documentar el cambio y notificar a los usuarios
## Alternative Approaches
1. **Usar glob patterns**: Aceptar patrones como `/static/**` explícitamente
- Más flexible pero más complejo de implementar
- Requiere cambiar el formato de configuración
2. **Usar regex**: Permitir expresiones regulares en las rutas públicas
- Muy flexible pero potencial security risk si no se sanitiza bien
3. **Mantener ambos modos**: Agregar un flag para elegir entre modo exacto o prefijo
- Más complejo pero backwards compatible