feat: Activation de compte utilisateur avec validation token
L'inscription Classeo se fait via invitation : un admin crée un compte, l'utilisateur reçoit un lien d'activation par email pour définir son mot de passe. Ce flow sécurisé évite les inscriptions non autorisées et garantit que seuls les utilisateurs légitimes accèdent au système. Points clés de l'implémentation : - Tokens d'activation à usage unique stockés en cache (Redis/filesystem) - Validation du consentement parental pour les mineurs < 15 ans (RGPD) - L'échec d'activation ne consume pas le token (retry possible) - Users dans un cache séparé sans TTL (pas d'expiration) - Hot reload en dev (FrankenPHP sans mode worker) Story: 1.3 - Inscription et activation de compte
This commit is contained in:
@@ -5,12 +5,21 @@
|
||||
# https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration
|
||||
parameters:
|
||||
tenant.base_domain: '%env(TENANT_BASE_DOMAIN)%'
|
||||
app.url: '%env(APP_URL)%'
|
||||
|
||||
services:
|
||||
# default configuration for services in this file
|
||||
_defaults:
|
||||
autowire: true # Automatically injects dependencies in your services.
|
||||
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
|
||||
bind:
|
||||
# Bind activation tokens cache pool (7-day TTL)
|
||||
Psr\Cache\CacheItemPoolInterface $activationTokensCache: '@activation_tokens.cache'
|
||||
# Bind users cache pool (no TTL - persistent data)
|
||||
Psr\Cache\CacheItemPoolInterface $usersCache: '@users.cache'
|
||||
# Bind named message buses
|
||||
Symfony\Component\Messenger\MessageBusInterface $eventBus: '@event.bus'
|
||||
Symfony\Component\Messenger\MessageBusInterface $commandBus: '@command.bus'
|
||||
|
||||
# makes classes in src/ available to be used as services
|
||||
# this creates a service per class whose id is the fully-qualified class name
|
||||
@@ -43,3 +52,27 @@ services:
|
||||
App\Shared\Infrastructure\Tenant\Command\TenantMigrateCommand:
|
||||
arguments:
|
||||
$projectDir: '%kernel.project_dir%'
|
||||
|
||||
# Administration services
|
||||
# Bind Repository interfaces to their implementations
|
||||
App\Administration\Domain\Repository\ActivationTokenRepository:
|
||||
alias: App\Administration\Infrastructure\Persistence\Redis\RedisActivationTokenRepository
|
||||
|
||||
App\Administration\Domain\Repository\UserRepository:
|
||||
alias: App\Administration\Infrastructure\Persistence\Cache\CacheUserRepository
|
||||
|
||||
App\Administration\Application\Port\PasswordHasher:
|
||||
alias: App\Administration\Infrastructure\Security\SymfonyPasswordHasher
|
||||
|
||||
# Clock interface binding
|
||||
App\Shared\Domain\Clock:
|
||||
alias: App\Shared\Infrastructure\Clock\SystemClock
|
||||
|
||||
# Domain policies (need explicit registration as Domain is excluded from autowiring)
|
||||
App\Administration\Domain\Policy\ConsentementParentalPolicy:
|
||||
autowire: true
|
||||
|
||||
# Email handlers
|
||||
App\Administration\Infrastructure\Messaging\SendActivationConfirmationHandler:
|
||||
arguments:
|
||||
$appUrl: '%app.url%'
|
||||
|
||||
Reference in New Issue
Block a user