resources/views/pages/frontend/docs/uml-secuencia-autenticacion.md
Última modificación: 24 Oct, 2026

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:

  1. 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.
  2. Inferencia de Identidad: El controlador discrimina si el parámetro corresponde a una dirección de correo o un nombre de usuario.
  3. Verificación Criptográfica: Invocación al Guard de autenticación mediante Hash::check (Bcrypt).
  4. Evaluación de Estatus: Se valida que la cuenta no se encuentre en estatus suspendido administrativo en MariaDB.
  5. 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.
  6. 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 box agrupan componentes que pertenecen a la misma capa tecnológica (Controladores vs. Infraestructura).
  • Las cajas opt y alt representan 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

Enlaces Relacionados

Edita este documento en >> uml-secuencia-autenticacion.md
← Volver a la Landing Page