3.1 Secuencia: Autenticación (Login Seguro)
Este diagrama modela la interacción cronológica entre los componentes del frontend, controladores, servicios perimetrales y capas de almacenamiento durante el procesamiento del inicio de sesión dual en Mañuti.
1. Explicación y Semántica del Diagrama
El flujo ilustra la aplicación secuencial de los controles de seguridad bancaria:
- Defensa Perimetral (Rate Limiting): Antes de validar credenciales, se consulta la memoria RAM de Redis para verificar si la combinación de IP e identificador superó el umbral de 5 intentos fallidos. En caso positivo, se desvía con error HTTP 429 y se actualiza el estatus del usuario a bloqueado temporal.
- Inferencia de Identidad: El controlador discrimina si el parámetro corresponde a una dirección de correo o un nombre de usuario.
- Verificación Criptográfica: Invocación al Guard de autenticación mediante
Hash::check(Bcrypt). - Evaluación de Estatus: Se valida que la cuenta no se encuentre en estatus suspendido administrativo en MariaDB.
- Política de Sesión Única: Antes de autorizar el acceso, se barren las sesiones previas abiertas del usuario en MariaDB (
open = 0) y se purgan sus llaves en Redis. - Regeneración de Sesión (Anti-Fixation): Se regenera el ID de sesión en memoria para neutralizar ataques de fijación de sesión antes de almacenar el nuevo registro espejo en la tabla
login.
2. Cómo se Lee este Diagrama
- Las líneas verticales continuas representan la línea de vida de cada participante (Lifeline).
- Los bloques
boxagrupan componentes que pertenecen a la misma capa tecnológica (Controladores vs. Infraestructura). - Las cajas
optyaltrepresentan bifurcaciones lógicas condicionales (Optional y Alternative Paths). - Los números secuenciales señalan el orden temporal estricto de las llamadas de método y respuestas de red.
3. Implementación en el Framework Mañuti
- Punto de Entrada:
App\Http\Controllers\AuthController@login. - Rate Limiting:
Illuminate\Support\Facades\RateLimiter. - Regeneración:
$request->session()->regenerate(). - Persistencia Espejo:
App\Models\Login::updateOrCreate(['session_id' => session()->getId()], ...).
4. Diagrama Mermaid
sequenceDiagram
autonumber
actor User as Usuario
participant View as Vista Login<br>(Blade)
box rgba(0, 0, 0, 1) Backend Controller Layer
participant Ctrl as AuthController
participant Auth as Laravel Auth<br>(Guard)
end
box rgba(0, 0, 0, 1) Infrastructure Layer
participant Redis as Redis<br>(RateLimiter/Session)
participant DB as MariaDB<br>(Users/Login)
end
User->>View: Ingresa Credenciales<br>(Usuario/Correo + Password)
View->>Ctrl: POST /login
opt Defensa: Rate Limiting
Ctrl->>Redis: RateLimiter::tooManyAttempts(IP|Login)
activate Redis
Redis-->>Ctrl: Resultado (Bool)
deactivate Redis
alt Bloqueado (Too Many Attempts)
Ctrl->>DB: Update cat_status = BLOQUEADO_TEMP
Ctrl-->>View: Error 429 "Demasiados intentos"
else Permitido
opt Validación de Identidad
Ctrl->>Ctrl: Determinar tipo (Email vs User)
Ctrl->>Auth: Auth::attempt(credentials)
activate Auth
Auth->>DB: Consultar Hash Password
DB-->>Auth: Hash Válido/Inválido
alt Credenciales Inválidas
Auth-->>Ctrl: False
Ctrl->>Redis: RateLimiter::hit() (Incrementar contador)
Ctrl->>DB: Insert into login_log (Fallido)
Ctrl-->>View: Error "Datos incorrectos"
else Credenciales Válidas
Auth-->>Ctrl: True (User Object)
deactivate Auth
opt Verificación de Estatus
Ctrl->>DB: Check cat_status
alt Suspendido
Ctrl->>Auth: logout()
Ctrl-->>View: Error "Cuenta Suspendida"
else Activo
Ctrl->>Redis: RateLimiter::clear()
opt Política de Sesión Única (Single Session)
Ctrl->>DB: Select open sessions (user_id)
loop Para cada sesión abierta anterior
Ctrl->>DB: Update login SET open=0
Ctrl->>Redis: Destroy Session Data
end
end
opt Regeneración de Seguridad (Anti-Fixation)
Ctrl->>Redis: session()->regenerate()
Note right of Ctrl: Genera nuevo ID de sesión<br>para evitar Session Fixation
end
opt Espejo de Sesión (Persistencia)
Ctrl->>DB: Insert/Update 'login' table<br>(New SessionID, open=1)
Ctrl->>DB: Insert 'login_log' (Exitoso)
end
Ctrl-->>View: Redirección 302 -> /administracion
end
end
end
end
end
end