presseportale/app/Authorization/Permission.php
Kevin Adametz 77f8f9cb35 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>
2026-07-14 13:48:50 +00:00

141 lines
3.7 KiB
PHP

<?php
namespace App\Authorization;
use App\Services\Admin\AdminSystemHealth;
/**
* Zentraler Katalog der Spatie-Permissions. Einzige Quelle für die
* Permission-Namen und die Rollen-Zuordnung — genutzt vom
* RolesAndPermissionsSeeder und von der Betriebsüberwachung
* ({@see AdminSystemHealth}). Blade-/Route-Gates verwenden
* weiterhin die String-Literale (Laravel-idiomatisch), deren kanonische
* Definition aber hier liegt.
*/
final class Permission
{
public const PressReleasesRead = 'press-releases:read';
public const PressReleasesWrite = 'press-releases:write';
public const PressReleasesPublish = 'press-releases:publish';
public const PressReleaseImagesWrite = 'press-release-images:write';
public const CompaniesRead = 'companies:read';
public const CompaniesWrite = 'companies:write';
public const CategoriesManage = 'categories:manage';
public const FooterCodesManage = 'footer-codes:manage';
public const BillingManage = 'billing:manage';
public const ComplianceManage = 'compliance:manage';
public const SettingsManage = 'settings:manage';
public const NewsletterSubscribe = 'newsletter:subscribe';
public const UsersManage = 'users:manage';
public const RolesManage = 'roles:manage';
public const ApiImmediatePublication = 'api:immediate-publication';
/**
* Alle existierenden Permissions.
*
* @return list<string>
*/
public static function all(): array
{
return [
self::PressReleasesRead,
self::PressReleasesWrite,
self::PressReleasesPublish,
self::PressReleaseImagesWrite,
self::CompaniesRead,
self::CompaniesWrite,
self::CategoriesManage,
self::FooterCodesManage,
self::BillingManage,
self::ComplianceManage,
self::SettingsManage,
self::NewsletterSubscribe,
self::UsersManage,
self::RolesManage,
self::ApiImmediatePublication,
];
}
/**
* Nur an `admin` vergebene Verwaltungsrechte (Befund H2). Basis für den
* Deployment-Check „Berechtigungen ausgerollt".
*
* @return list<string>
*/
public static function adminOnly(): array
{
return [
self::CompaniesWrite,
self::CategoriesManage,
self::FooterCodesManage,
self::BillingManage,
self::ComplianceManage,
self::SettingsManage,
self::UsersManage,
self::RolesManage,
];
}
/**
* Permissions der Rolle `editor` (Content-Rolle ohne destruktive/Verwaltung).
*
* @return list<string>
*/
public static function editor(): array
{
return [
self::PressReleasesRead,
self::PressReleasesWrite,
self::PressReleasesPublish,
self::PressReleaseImagesWrite,
self::CompaniesRead,
self::NewsletterSubscribe,
];
}
/**
* Permissions der Rolle `customer`.
*
* @return list<string>
*/
public static function customer(): array
{
return [
self::PressReleasesRead,
self::PressReleasesWrite,
self::PressReleaseImagesWrite,
self::CompaniesRead,
self::NewsletterSubscribe,
];
}
/**
* Permissions der Rolle `api-only`.
*
* @return list<string>
*/
public static function apiOnly(): array
{
return [
self::PressReleasesRead,
self::PressReleasesWrite,
self::PressReleaseImagesWrite,
self::CompaniesRead,
self::NewsletterSubscribe,
];
}
}