Skip to content

feat(admin-acl): Modulbasierte ACL für Filament-Panel (all vs selected modules) #11

Description

@obrunsmann

Ziel

Im Filament-Adminpanel soll pro User steuerbar sein, ob er alles sehen darf oder nur ausgewählte Module (z. B. nur Betankungen).

Anforderungen

  • Pro User konfigurierbar:
    • all (voller Modulzugriff)
    • selected (nur freigegebene Module)
  • Beispiel: User mit selected + refuelings darf nur Betankungen sehen/nutzen.
  • Zugriff muss sicher sein (nicht nur Navigation verstecken, sondern echte Autorisierung für direkte URL-Aufrufe).

Umsetzung (klarer Plan)

  1. DB-Erweiterung users
  • Neue Felder hinzufügen:
    • panel_scope (enum/string, Werte: all, selected, Default: selected)
    • panel_modules (json, Default: [])
  • Migration inkl. sauberem down().
  1. User-Model erweitern
  • Casts ergänzen:
    • panel_modules als Collection/Array
  • Methoden ergänzen:
    • canUsePanelModule(string $module): bool
      • true, wenn isAdmin()
      • oder panel_scope === 'all'
      • oder panel_scope === 'selected' und Modul in panel_modules enthalten
  • canAccessPanel(Panel $panel) anpassen:
    • Admin weiterhin erlaubt
    • ansonsten Zugang nur, wenn all oder mindestens ein Modul freigegeben ist.
  1. ACL über Policies umsetzen (nicht nur Navigation)
  • Für jede Filament-Resource Policy erstellen/registrieren.
  • viewAny() pro Resource an canUsePanelModule('<module_key>') koppeln.
  • Für Actions (create, update, delete, etc.) konsistent entscheiden:
    • entweder gleiches Modulrecht
    • oder feiner, falls nötig.
  • Mapping-Vorschlag:
    • refuelings
    • gas_stations
    • expenses
    • fi_settlements
    • training_fund_reports
    • aircraft
    • departments
  1. Filament UI zum Pflegen der Rechte
  • In User-Verwaltung (bestehender Flow) Eingabefelder ergänzen:
    • panel_scope (Select: all / selected)
    • panel_modules (MultiSelect mit klaren Labels, gespeicherte Values = Modul-Keys)
  • UX:
    • Wenn panel_scope = all, panel_modules optional deaktivieren/ausblenden.
  1. Sicherheits-/Konsistenzcheck
  • Verifizieren, dass verbotene Resources weder in Navigation erscheinen noch per URL erreichbar sind (403).
  • Keine alleinige Nutzung von shouldRegisterNavigation() als ACL.

Akzeptanzkriterien

  • User kann auf all oder selected gesetzt werden.
  • Bei selected sind nur freigegebene Module sichtbar.
  • Direkter URL-Zugriff auf nicht freigegebene Resource liefert 403.
  • Beispiel funktioniert: User mit nur refuelings sieht/nutzt nur Betankungen.
  • Admin-User (Intranet Admin) hat weiterhin Vollzugriff.
  • Tests vorhanden (mindestens Feature-Tests für viewAny/Routen-Zugriff je Modul).

Technische Hinweise

  • Filament 5 autorisiert Resources über Laravel Policies (viewAny etc.).
  • Navigation-Hiding allein ist kein Zugriffsschutz.
  • Bestehende roles aus Vereinsflieger bleiben unberührt; neue Panel-ACL ist ergänzend.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions