- WebPortalContext::fromRequest() buendelt die zuvor ~6x je Route-Closure
wiederholte Host->Portal-Ableitung (portal, language, portalValues,
domainConfig).
- DomainAssetContext::applyWebDomainConfig() ist die Single Source of Truth fuer
die Domain-/Theme-Anwendung (config + View::share + Vite); die fruehere
$applyWebDomainConfig-Closure in routes/web.php ist nur noch ein duenner
Delegations-Wrapper, damit Bare-Root- und Edition-Home-Route unveraendert
per Closure aufrufen koennen.
- Die 6 Portal-Seiten-Closures (Kategorie, Detail, Veroeffentlichen, Suche,
Newsrooms, Newsroom-Detail) sowie Preise nutzen jetzt den zentralen Kontext.
Abgesichert durch die 92 Web/-Tests (jede Seite laeuft ueber den neuen Kontext).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Befund (Review 16.06.): Der Volt-Login machte direkt Auth::attempt() und umging
Fortifys 2FA-Pipeline (2FA-Bypass); zusätzlich existierte der Fortify-POST /login
parallel mit schwächeren Post-Login-Regeln.
Fix (Volt-nativ):
- Volt-Login prüft Credentials ohne sofortiges Login; bei aktivem 2FA wird der
Session-Vertrag login.id/login.remember gesetzt und auf eine neue Volt-
2FA-Challenge-Seite (/two-factor-challenge) geleitet, die an Fortifys
bestehenden Controller postet (TOTP + Recovery-Code).
- Gemeinsame Post-Login-Logik in App\Support\LoginRedirect (rollengerechtes
Home + 403-sicherer intended-Redirect), genutzt von Volt-Login UND Response.
- RoleAwareLoginResponse implementiert jetzt LoginResponse UND
TwoFactorLoginResponse und erzwingt einheitlich: unverifiziert → Notice,
verifiziert-inaktiv → Logout+Fehler, sonst 403-sicherer Redirect. Damit ist
auch der direkte Fortify-POST-Pfad gehärtet.
Tests: 2FA-Übergabe, Challenge-Guard, voller TOTP-Flow, Fortify-POST blockt
inaktive User und hält Customer aus dem Admin-Bereich.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>