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:
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Administration\Domain\Policy;
|
||||
|
||||
use App\Shared\Domain\Clock;
|
||||
use DateTimeImmutable;
|
||||
|
||||
/**
|
||||
* Policy déterminant si le consentement parental est requis.
|
||||
*
|
||||
* Conformément au RGPD (NFR-C1), le consentement parental est obligatoire
|
||||
* pour les utilisateurs de moins de 15 ans.
|
||||
*/
|
||||
final readonly class ConsentementParentalPolicy
|
||||
{
|
||||
private const int AGE_MAJORITE_NUMERIQUE = 15;
|
||||
|
||||
public function __construct(
|
||||
private Clock $clock,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si le consentement parental est requis pour un utilisateur
|
||||
* né à la date spécifiée.
|
||||
*/
|
||||
public function estRequis(?DateTimeImmutable $dateNaissance): bool
|
||||
{
|
||||
if ($dateNaissance === null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $this->calculerAge($dateNaissance) < self::AGE_MAJORITE_NUMERIQUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calcule l'âge en années à partir de la date de naissance.
|
||||
*/
|
||||
private function calculerAge(DateTimeImmutable $dateNaissance): int
|
||||
{
|
||||
$now = $this->clock->now();
|
||||
$interval = $now->diff($dateNaissance);
|
||||
|
||||
return $interval->y;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user