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):
- El administrador presiona el botón "Desconectar" en la grilla de
/sesiones-activas. - El controlador
ActiveSessionController@destroyejecuta el borrado de la llave en Redis y actualizaopen = 0en MariaDB. - Se despacha el evento de WebSocket
UserSessionTerminatedcon el ID del operador afectado.
- El administrador presiona el botón "Desconectar" en la grilla de
- Fase 2 (Intercepción y Desconexión Remota):
- El navegador del usuario remoto escucha el evento
.session.terminateden el canal privadoprivate-user.{id}. - El frontend fuerza la navegación hacia el dashboard administrativo (
/administracion). - El middleware
CheckActiveSessionintercepta la petición, consulta la base de datos relacional y detecta queopen == 0. - El middleware aborta la sesión (
Auth::logout(),session()->invalidate()) y desvía al usuario al/logincon código HTTP 302 y mensaje de advertencia.
- El navegador del usuario remoto escucha el evento
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
CheckActiveMiddlewareilustra 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