LMIV-SNACKAUTOMAT/app/Http/Controllers/Concerns/HasTenantSecurity.php

88 lines
2.5 KiB
PHP

<?php
namespace App\Http\Controllers\Concerns;
use Illuminate\Support\Facades\Auth;
trait HasTenantSecurity
{
/**
* Gibt die Mandanten-ID zurück, auf die der aktuelle Benutzer zugreifen darf
* - Super Admins: Session-basierte Mandantenauswahl oder null (alle Mandanten)
* - Mandanten-Admins: Nur ihr eigener Mandant
*/
protected function getCurrentTenantId(): ?int
{
$user = Auth::user();
if (!$user) {
return null;
}
// Super Admins können über Session den Mandanten wechseln
if ($user->isSuperAdmin()) {
return session('current_tenant_id');
}
// Mandanten-Admins sind auf ihren eigenen Mandanten beschränkt
if ($user->isTenantAdmin()) {
return $user->tenant_id;
}
return null;
}
/**
* Prüft ob der aktuelle Benutzer auf den angegebenen Mandanten zugreifen darf
*/
protected function canAccessTenant(?int $tenantId): bool
{
$user = Auth::user();
if (!$user) {
return false;
}
// Super Admins haben Zugriff auf alle Mandanten
if ($user->isSuperAdmin()) {
return true;
}
// Mandanten-Admins nur auf ihren eigenen Mandanten
if ($user->isTenantAdmin()) {
return $user->tenant_id === $tenantId;
}
return false;
}
/**
* Wirft eine 403-Exception wenn der Benutzer nicht auf den Mandanten zugreifen darf
*/
protected function ensureTenantAccess(?int $tenantId): void
{
if (!$this->canAccessTenant($tenantId)) {
abort(403, 'Zugriff auf diesen Mandanten nicht erlaubt');
}
}
/**
* Stellt sicher dass Mandanten-Admins ihre Session auf ihren eigenen Mandanten setzen
*/
protected function ensureCorrectTenantSession(): void
{
$user = Auth::user();
if ($user && $user->isTenantAdmin()) {
// Mandanten-Admins müssen immer ihren eigenen Mandanten in der Session haben
if (session('current_tenant_id') !== $user->tenant_id) {
session(['current_tenant_id' => $user->tenant_id]);
// Lade auch den Mandanten in die Session
if ($user->tenant) {
session(['current_tenant' => $user->tenant]);
}
}
}
}
}