presseportale/app/Http/Middleware/EnsureUserIsAdmin.php
Kevin Adametz 31e01e46b6 Optimierung 3.6: Zugriffs-Gates und getrennte Impersonation-Sperre
- Gate::define('access-admin'|'access-customer') als Single Source of Truth im
  AppServiceProvider (auch via @can/Policies nutzbar). EnsureUserIsAdmin und
  EnsureUserIsCustomer pruefen jetzt ueber diese Gates.
- Impersonation-Redirect aus EnsureUserIsAdmin in die eigene Middleware
  BlockAdminDuringImpersonation ausgelagert (Sitzungs-Bedingung statt
  Rollenfrage); laeuft vor der Zugriffspruefung und ist zusaetzlich als
  persistente Livewire-Middleware registriert.
- Routen-Alias 'can:' bewusst NICHT verwendet: die Admin-Middleware ist
  persistente Livewire-Middleware und braucht eine konkrete Klasse; der
  parametrisierte Alias kann dort nicht stehen. EnsureApiUserIsActive bleibt
  eigenstaendig (is_active-Pruefung mit getesteter JSON-Antwort, kein Gate).
- Tests: Auth/AccessGatesTest; UserImpersonationTest bleibt gruen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 11:20:28 +00:00

26 lines
750 B
PHP

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Symfony\Component\HttpFoundation\Response;
/**
* Reine Zugriffsprüfung auf den Admin-Bereich über das `access-admin`-Gate. Die
* Impersonation-Sperre liegt in {@see BlockAdminDuringImpersonation} und läuft
* davor. Bleibt eine konkrete Klasse (statt `can:access-admin`), weil sie als
* persistente Livewire-Middleware registriert ist (AppServiceProvider).
*/
class EnsureUserIsAdmin
{
public function handle(Request $request, Closure $next): Response
{
if (Gate::denies('access-admin')) {
abort(403, 'Kein Zugriff auf den Admin-Bereich.');
}
return $next($request);
}
}