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:
@@ -29,6 +29,11 @@ framework:
|
||||
adapter: cache.adapter.filesystem
|
||||
default_lifetime: 900 # 15 minutes
|
||||
|
||||
# Pool dédié aux sessions (7 jours TTL max)
|
||||
sessions.cache:
|
||||
adapter: cache.adapter.filesystem
|
||||
default_lifetime: 604800 # 7 jours
|
||||
|
||||
# Test environment uses Redis to avoid filesystem cache timing issues in E2E tests
|
||||
# (CLI creates tokens, FrankenPHP must see them immediately)
|
||||
when@test:
|
||||
@@ -55,6 +60,10 @@ when@test:
|
||||
adapter: cache.adapter.redis
|
||||
provider: '%env(REDIS_URL)%'
|
||||
default_lifetime: 900
|
||||
sessions.cache:
|
||||
adapter: cache.adapter.redis
|
||||
provider: '%env(REDIS_URL)%'
|
||||
default_lifetime: 604800
|
||||
|
||||
when@prod:
|
||||
framework:
|
||||
@@ -84,3 +93,7 @@ when@prod:
|
||||
adapter: cache.adapter.redis
|
||||
provider: '%env(REDIS_URL)%'
|
||||
default_lifetime: 900 # 15 minutes
|
||||
sessions.cache:
|
||||
adapter: cache.adapter.redis
|
||||
provider: '%env(REDIS_URL)%'
|
||||
default_lifetime: 604800 # 7 jours
|
||||
|
||||
@@ -21,6 +21,8 @@ services:
|
||||
Psr\Cache\CacheItemPoolInterface $refreshTokensCache: '@refresh_tokens.cache'
|
||||
# Bind password reset tokens cache pool (1-hour TTL)
|
||||
Psr\Cache\CacheItemPoolInterface $passwordResetTokensCache: '@password_reset_tokens.cache'
|
||||
# Bind sessions cache pool (7-day TTL)
|
||||
Psr\Cache\CacheItemPoolInterface $sessionsCache: '@sessions.cache'
|
||||
# Bind named message buses
|
||||
Symfony\Component\Messenger\MessageBusInterface $eventBus: '@event.bus'
|
||||
Symfony\Component\Messenger\MessageBusInterface $commandBus: '@command.bus'
|
||||
@@ -112,6 +114,14 @@ services:
|
||||
App\Administration\Domain\Repository\PasswordResetTokenRepository:
|
||||
alias: App\Administration\Infrastructure\Persistence\Redis\RedisPasswordResetTokenRepository
|
||||
|
||||
# Session Repository
|
||||
App\Administration\Domain\Repository\SessionRepository:
|
||||
alias: App\Administration\Infrastructure\Persistence\Redis\RedisSessionRepository
|
||||
|
||||
# GeoLocation Service (null implementation - no geolocation)
|
||||
App\Administration\Application\Port\GeoLocationService:
|
||||
alias: App\Administration\Infrastructure\Service\NullGeoLocationService
|
||||
|
||||
# Password Reset Processor with rate limiters
|
||||
App\Administration\Infrastructure\Api\Processor\RequestPasswordResetProcessor:
|
||||
arguments:
|
||||
|
||||
Reference in New Issue
Block a user