withRouting( web: __DIR__.'/../routes/domains.php', api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', health: '/up', then: function (): void { // Legacy-API-Aliasse (/service/… ohne /api-Präfix) in der // api-Middleware-Gruppe — Übernahme bestehender Integrationen. Route::middleware('api')->group(__DIR__.'/../routes/legacy-api.php'); }, ) ->withMiddleware(function (Middleware $middleware) { // Security-Header auf allen Antworten (Web + API), Proxy-unabhängig. $middleware->append(SecurityHeaders::class); // Portal-Kontext nach dem Theme-Provider setzen (liest config('app.theme')) $middleware->append(SetCurrentPortal::class); // Ausgabe/Sprache (de|en) aus dem URL-Präfix ableiten und URL-Defaults setzen. $middleware->append(SetEdition::class); // Wohin eingeloggte User von Gast-Routen (/login, /register) gelenkt // werden: rollen- und verifizierungsbewusst statt fix auf /dashboard, // sonst landet ein Customer dort im 403 und sitzt fest. $middleware->redirectUsersTo(function (Request $request) { $user = $request->user(); if ($user && ! $user->hasVerifiedEmail()) { return route('verification.notice'); } if ($user?->canAccessAdmin()) { return route('dashboard'); } return $user?->canAccessCustomer() ? route('me.dashboard') : '/'; }); $middleware->api(prepend: [ LogApiUsage::class, RejectLegacyApiKeys::class, ]); $middleware->alias([ 'abilities' => CheckAbilities::class, 'ability' => CheckForAnyAbility::class, ]); // BasicAuth ganz am Ende, nach Session-Middleware. Immer anhängen; // ob erzwungen wird, entscheidet die Middleware zur Laufzeit anhand // von config('auth.basic.*') (greift auch unter `config:cache`). $middleware->append(BasicAuthMiddleware::class); // Trust all proxies (for Traefik/Docker setup) $middleware->trustProxies( at: '*', headers: Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO ); }) ->withExceptions(function (Exceptions $exceptions) { // })->create();