88 lines
2.5 KiB
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]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |