- 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>
34 lines
1.1 KiB
PHP
34 lines
1.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Middleware;
|
|
|
|
use App\Actions\Admin\UserImpersonation;
|
|
use Closure;
|
|
use Illuminate\Http\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
/**
|
|
* Sperrt den Admin-Bereich, solange eine Benutzer-Impersonation läuft. GET/HEAD
|
|
* werden auf das Kunden-Dashboard umgeleitet (der Admin agiert in der
|
|
* Kunden-Sicht), schreibende Zugriffe werden hart abgewiesen.
|
|
*
|
|
* Bewusst von der reinen Zugriffsprüfung ({@see EnsureUserIsAdmin}) getrennt:
|
|
* Impersonation ist eine Sitzungs-Bedingung, keine Rollenfrage.
|
|
*/
|
|
class BlockAdminDuringImpersonation
|
|
{
|
|
public function __construct(private readonly UserImpersonation $impersonation) {}
|
|
|
|
public function handle(Request $request, Closure $next): Response
|
|
{
|
|
if ($this->impersonation->isActive()) {
|
|
if ($request->isMethod('GET') || $request->isMethod('HEAD')) {
|
|
return redirect()->route('me.dashboard');
|
|
}
|
|
|
|
abort(403, 'Während der Benutzer-Impersonation ist der Admin-Bereich gesperrt.');
|
|
}
|
|
|
|
return $next($request);
|
|
}
|
|
}
|