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

3.4 Secuencia: Kill Switch & Logout Remoto

Este diagrama modela la coordinación en dos fases para la terminación forzada e instantánea de una sesión remota mediante eventos de difusión en tiempo real sobre Laravel Reverb.


1. Explicación y Semántica del Diagrama

El proceso resuelve la expulsión de terminales concurrentes o no autorizadas:

  • Fase 1 (Acción Administrativa):
    1. El administrador presiona el botón "Desconectar" en la grilla de /sesiones-activas.
    2. El controlador ActiveSessionController@destroy ejecuta el borrado de la llave en Redis y actualiza open = 0 en MariaDB.
    3. Se despacha el evento de WebSocket UserSessionTerminated con el ID del operador afectado.
  • Fase 2 (Intercepción y Desconexión Remota):
    1. El navegador del usuario remoto escucha el evento .session.terminated en el canal privado private-user.{id}.
    2. El frontend fuerza la navegación hacia el dashboard administrativo (/administracion).
    3. El middleware CheckActiveSession intercepta la petición, consulta la base de datos relacional y detecta que open == 0.
    4. El middleware aborta la sesión (Auth::logout(), session()->invalidate()) y desvía al usuario al /login con código HTTP 302 y mensaje de advertencia.

2. Cómo se Lee este Diagrama

  • El diagrama separa la acción del Administrador (Fase 1) del impacto que se experimenta en la pantalla del Usuario Remoto (Fase 2).
  • La interacción con CheckActiveMiddleware ilustra por qué el usuario no puede evadir la expulsión incluso si ignora la alerta en el navegador.

3. Implementación en el Framework Mañuti

  • Controlador: App\Http\Controllers\Admin\ActiveSessionController@destroy.
  • Evento: App\Events\UserSessionTerminated.
  • Middleware: App\Http\Middleware\CheckActiveSession.
  • Cliente JS: resources/views/partials/auth-listener.blade.php.

4. Diagrama Mermaid

sequenceDiagram
    autonumber

    actor Admin as Administrador
    participant Ctrl as ActiveSession<br>Controller
    participant DB as MariaDB<br>(Tabla login)
    participant Redis as Redis<br>(Session Store)
    actor User as Usuario Remoto
    participant Mid as CheckActive<br>Middleware

    opt Fase 1: Acción Administrativa
        Admin->>Ctrl: Clic "Desconectar Usuario X"
        activate Ctrl
        Ctrl->>Redis: Delete Session Key
        Ctrl->>DB: UPDATE login SET open = 0 WHERE id = X
        Ctrl-->>Admin: Toast "Sesión Cerrada"
        deactivate Ctrl
    end

    opt Fase 2: Intercepción (El usuario intenta navegar)
        User->>Mid: GET /dashboard (con Cookie SessionID)
        activate Mid
        
        Mid->>DB: SELECT * FROM login WHERE session_id = ? AND open = 1
        
        alt Registro NO encontrado (Open = 0)
            DB-->>Mid: Null / Empty
            
            Mid->>Mid: Auth::logout()
            Mid->>Mid: Session::invalidate()
            Mid->>Mid: Regenerate Token
            
            Mid-->>User: Redirección 302 -> /login<br>(Msg: "Sesión cerrada remotamente")
        else Registro Válido
            DB-->>Mid: Objeto Sesión
            Mid-->>User: Permite Acceso (200 OK)
        end
        deactivate Mid
    end

Enlaces Relacionados

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