Configuration SMTP et 2FA par code PIN e-mail

Paramètres du site :
- Nouvelle section "Serveur SMTP" avec host, port, chiffrement,
  identifiant, mot de passe, adresse/nom d'expéditeur
- Bouton "Envoyer un e-mail de test" (AJAX via Symfony EsmtpTransport) :
  tente la connexion + envoie un message réel à l'admin
- Badge "Configuré — 2FA actif" quand SMTP est en place
- Suppression de la configuration possible

Authentification 2FA :
- Si SMTP configuré : après validation identifiant/mot de passe,
  l'utilisateur est déconnecté, un PIN à 6 chiffres est généré,
  haché (bcrypt) et stocké en session, envoyé par e-mail (10 min)
- Page /2fa : saisie du PIN, bouton "Renvoyer le code", retour login
- Si l'envoi e-mail échoue : fallback sans 2FA (logue l'erreur)
- Si SMTP non configuré : login standard inchangé

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-04 18:59:18 +02:00
parent e6f4d0c565
commit 07ab2a7063
11 changed files with 564 additions and 19 deletions
+19 -4
View File
@@ -13,11 +13,26 @@ class AppServiceProvider extends ServiceProvider
public function boot(): void
{
// Partage les paramètres globaux du site avec toutes les vues
View::share('siteLogoUrl', SiteSettingsService::logoUrl());
View::share('registrationEnabled', SiteSettingsService::registrationEnabled());
View::share('siteName', SiteSettingsService::siteName());
View::share('siteLogoUrl', SiteSettingsService::logoUrl());
View::share('registrationEnabled', SiteSettingsService::registrationEnabled());
View::share('siteName', SiteSettingsService::siteName());
// Remplace config('app.name') par le titre du site défini dans les paramètres
// Remplace config('app.name') par le titre défini dans les paramètres
config(['app.name' => SiteSettingsService::siteName()]);
// Applique la configuration SMTP si elle est définie dans les paramètres
if (SiteSettingsService::smtpConfigured()) {
$smtp = SiteSettingsService::smtpConfig();
config([
'mail.default' => 'smtp',
'mail.mailers.smtp.host' => $smtp['host'],
'mail.mailers.smtp.port' => (int) ($smtp['port'] ?? 587),
'mail.mailers.smtp.encryption' => $smtp['encryption'] ?: null,
'mail.mailers.smtp.username' => $smtp['username'] ?? null,
'mail.mailers.smtp.password' => $smtp['password'] ?? null,
'mail.from.address' => $smtp['from_address'] ?? null,
'mail.from.name' => $smtp['from_name'] ?? SiteSettingsService::siteName(),
]);
}
}
}