feat: Gestion des sessions utilisateur

Permet aux utilisateurs de visualiser et gérer leurs sessions actives
sur différents appareils, avec la possibilité de révoquer des sessions
à distance en cas de suspicion d'activité non autorisée.

Fonctionnalités :
- Liste des sessions actives avec métadonnées (appareil, navigateur, localisation)
- Identification de la session courante
- Révocation individuelle d'une session
- Révocation de toutes les autres sessions
- Déconnexion avec nettoyage des cookies sur les deux chemins (legacy et actuel)

Sécurité :
- Cache frontend scopé par utilisateur pour éviter les fuites entre comptes
- Validation que le refresh token appartient à l'utilisateur JWT authentifié
- TTL des sessions Redis aligné sur l'expiration du refresh token
- Événements d'audit pour traçabilité (SessionInvalidee, ToutesSessionsInvalidees)

@see Story 1.6 - Gestion des sessions
This commit is contained in:
2026-02-03 10:10:40 +01:00
parent affad287f9
commit b823479658
40 changed files with 4222 additions and 42 deletions

View File

@@ -0,0 +1,32 @@
<?php
declare(strict_types=1);
namespace App\Administration\Application\Port;
use App\Administration\Domain\Model\Session\Location;
/**
* Port interface for IP geolocation operations.
*
* This abstracts the geolocation mechanism, allowing the Application
* layer to remain independent of the specific implementation
* (e.g., MaxMind GeoLite2, IP-API, etc.).
*
* Current implementation: NullGeoLocationService (stores IP without resolution).
* Future implementation: MaxMindGeoLocationService using GeoLite2-City database
* for country/city resolution. This will be implemented when the feature is
* prioritized (requires GeoLite2 license and periodic database updates).
*
* @see Story 1.6 - Gestion des sessions
*/
interface GeoLocationService
{
/**
* Locate an IP address.
*
* Returns Location with country and city if available,
* or Location::unknown() if geolocation fails.
*/
public function locate(string $ipAddress): Location;
}