security: Rechteausweitung schließen & Admin-Panel feingranular gaten (K1, H1, H2, M8)
- users:manage/roles:manage auf allen User-/Rollen-Masken erzwungen; is_super_admin aus $fillable entfernt und nur per autorisiertem forceFill setzbar; zentraler Gate::before-Super-Admin-Kurzschluss (K1/M8). - Nicht-Super-Admins können Super-Admin-Konten nicht mehr bearbeiten (Fix#2); Impersonation mit Rangprüfung, keine Token-Erstellung während Impersonation (H1). - Destruktive/verwaltende Admin-Aktionen (CRM/Billing/Compliance/Struktur) hängen an neuen admin-only Permissions; Editor behält reine Content-Rechte (H2). - Kanonischer Permission-Katalog (App\Authorization\Permission) als Single Source of Truth für Seeder und Monitoring. Deployment: `php artisan db:seed --class=RolesAndPermissionsSeeder` auf allen Umgebungen ausführen (neue Permissions). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
39e13d6d84
commit
77f8f9cb35
34 changed files with 748 additions and 100 deletions
|
|
@ -151,7 +151,7 @@ class UserImporter
|
|||
$regType = self::REG_TYPE_MAP[$row->registration_type] ?? RegistrationType::ExistingLegacy;
|
||||
|
||||
$user = User::withoutTimestamps(function () use ($email, $name, $portal, $regType, $language, $row, $legacyPortal): User {
|
||||
return User::query()->updateOrCreate(
|
||||
$user = User::query()->updateOrCreate(
|
||||
['email' => $email],
|
||||
[
|
||||
'name' => $name,
|
||||
|
|
@ -159,7 +159,6 @@ class UserImporter
|
|||
'registration_type' => $regType->value,
|
||||
'language' => $language,
|
||||
'is_active' => (bool) $row->is_active,
|
||||
'is_super_admin' => (bool) $row->is_super_admin,
|
||||
'last_login_at' => $row->last_login ?: null,
|
||||
'last_login_ip' => $row->ip_address ?: null,
|
||||
'legacy_portal' => $legacyPortal,
|
||||
|
|
@ -169,6 +168,12 @@ class UserImporter
|
|||
// Kein Passwort – User erhält Go-Live-Reset-Mail (D-09)
|
||||
]
|
||||
);
|
||||
|
||||
// is_super_admin ist nicht mass-assignable (siehe User::$fillable) –
|
||||
// im vertrauenswürdigen Import explizit per forceFill setzen.
|
||||
$user->forceFill(['is_super_admin' => (bool) $row->is_super_admin])->save();
|
||||
|
||||
return $user;
|
||||
});
|
||||
|
||||
// Rolle zuweisen
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue