Ein ausgeblendeter Menüpunkt gilt oft schon als ausreichende Zugriffskontrolle im Filament-Adminpanel. Das stimmt nicht: Die Oberfläche kann eine Funktion verbergen, während ein direkter Aufruf oder ein anderer Einstieg weiterhin möglich ist. Belastbare Berechtigungen entstehen erst, wenn der Server jede Aktion für den konkreten Benutzer und den betroffenen Datensatz prüft.
Für die Planung bedeutet das: Eine Rolle allein beantwortet die Zugriffsfrage selten vollständig. Du brauchst zusätzlich Regeln für einzelne Aktionen, Datensatzgrenzen und gegebenenfalls sensible Felder. Die sichtbare Filament-Oberfläche bildet diese Regeln anschließend ab, entscheidet aber nicht über ihre Sicherheit.
Eine Rolle ist nur ein Teil der Zugriffsentscheidung
Nehmen wir ein Adminpanel für einen kleinen Großhandel. Der Vertrieb pflegt Kundendaten, das Lager benötigt Lieferadressen und die Buchhaltung arbeitet mit Rechnungsinformationen. Alle drei Bereiche verwenden dieselben Aufträge, dürfen damit aber Unterschiedliches tun.
Eine pauschale Rolle wie Mitarbeiter hilft hier kaum. Selbst die Rollen Vertrieb, Lager und Buchhaltung reichen noch nicht, wenn Vertriebsmitarbeiter nur Kunden aus ihrem Gebiet sehen sollen oder Lagerkräfte keinen Zugriff auf interne Preisnotizen erhalten dürfen.
Für jede relevante Funktion solltest du deshalb vier Fragen beantworten:
- Bereich: Darf die Rolle die betreffende Filament-Resource überhaupt verwenden? Eine Resource ist dabei die Verwaltungsoberfläche für ein fachliches Objekt wie Kunde, Auftrag oder Rechnung.
- Aktion: Darf sie Datensätze ansehen, anlegen, ändern, löschen oder exportieren?
- Datensatz: Gilt das Recht für alle Datensätze oder nur für zugewiesene Kunden, Teams, Standorte oder Regionen?
- Information: Darf die Rolle alle dargestellten Felder sehen und bearbeiten?
Die eigentliche Berechtigungsregel lässt sich damit als Kombination aus Benutzer, Aktion, Datensatz und Kontext betrachten. Diese Trennung verhindert, dass eine grobe Rollenbezeichnung unbemerkt zu weitreichende Rechte erhält.
Schreibe zuerst eine Berechtigungsmatrix
Bevor du Policies, Rollenpakete oder Filament-Konfigurationen anfasst, hältst du die fachlichen Regeln in einer kleinen Matrix fest. Dafür genügt eine Tabelle im Projektticket oder in der fachlichen Dokumentation. Sie sollte pro Bereich mindestens Rolle, Aktion, Datensatzumfang und Besonderheiten enthalten.
Für das Beispiel könnte die Beschreibung so aussehen:
- Der Vertrieb darf zugewiesene Kunden und deren Aufträge ansehen und Kontaktdaten ändern. Ein Gesamtexport ist nicht erlaubt.
- Das Lager darf offene Aufträge und Lieferadressen sehen, aber weder Kundenstammdaten ändern noch Rechnungsinformationen öffnen.
- Die Buchhaltung darf Rechnungen aller Standorte bearbeiten, benötigt jedoch keinen Zugriff auf interne Vertriebsnotizen.
- Die Geschäftsführung darf Auswertungen über alle Standorte abrufen, soll operative Datensätze aber nicht versehentlich bearbeiten.
Formuliere dabei konkrete Tätigkeiten statt allgemeiner Begriffe wie Vollzugriff oder eingeschränkter Zugriff. Solche Sammelbegriffe verschieben die entscheidenden Fragen nur in die Entwicklung.
Die Matrix ist außerdem die Grundlage für Abnahme und Tests. Wenn niemand eindeutig sagen kann, ob die Buchhaltung einen Kundendatensatz löschen darf, kann auch keine technische Umsetzung eindeutig richtig sein.
Serverseitige Regeln und sichtbare Oberfläche haben verschiedene Aufgaben
In einer Laravel-Anwendung gehören fachliche Zugriffsregeln üblicherweise in Policies. Eine Policy ist eine serverseitige Regelklasse, die beispielsweise entscheidet, ob ein Benutzer einen bestimmten Auftrag ansehen oder bearbeiten darf. Filament kann diese Entscheidung beim Aufbau seiner Verwaltungsoberfläche berücksichtigen.
Das Ausblenden eines Buttons oder Navigationseintrags dient dagegen hauptsächlich der Bedienbarkeit. Benutzer sollen keine Funktionen sehen, die sie ohnehin nicht verwenden dürfen. Als alleinige Schutzmaßnahme reicht die Sichtbarkeit jedoch nicht aus.
Für ein Filament-Adminpanel brauchst du deshalb drei aufeinander abgestimmte Ebenen:
- Die Policy schützt die Aktion. Sie prüft auch dann, wenn ein Benutzer eine Bearbeitungsseite direkt aufruft oder eine Aktion über einen ungewöhnlichen Weg erreicht.
- Die Abfrage begrenzt die sichtbaren Datensätze. Ein Vertriebsmitarbeiter soll fremde Kunden weder in der Liste noch in Suchergebnissen oder Auswahlfeldern finden.
- Die Oberfläche spiegelt die Regeln wider. Nicht erlaubte Aktionen, Felder und Bereiche werden gar nicht erst angeboten.
Policy und begrenzte Abfrage ersetzen einander nicht. Eine Policy kann den direkten Zugriff auf einen fremden Auftrag blockieren, während eine unbeschränkte Liste trotzdem Namen oder andere Metadaten offenlegt. Eine gefilterte Liste wiederum verhindert noch nicht automatisch den Zugriff über eine bekannte Datensatz-ID. Erst beide Prüfungen schließen die jeweiligen Lücken.
Setze Rollen, Aktionen und Datensatzgrenzen in dieser Reihenfolge um
Stabile Rollen aus Verantwortlichkeiten ableiten
Rollen sollten wiederkehrende Verantwortlichkeiten abbilden, nicht einzelne Personen. Buchhaltung ist eine brauchbare Rolle, wenn mehrere Benutzer dieselben Aufgaben erledigen. Zugriff für Anna außer freitags ist keine Rolle, sondern eine Sonderregel mit eingebautem Wartungsproblem.
Halte die Zahl der Rollen überschaubar. Unterschiede beim Datensatzumfang lassen sich häufig über Zuordnungen wie Team, Standort, Mandant oder verantwortlicher Benutzer ausdrücken. Du benötigst dann beispielsweise eine Vertriebsrolle und eine Datensatzregel für das jeweilige Gebiet statt einer eigenen Rolle für jedes Gebiet.
Aktionen ausdrücklich erlauben
Lege pro fachlichem Objekt fest, welche Aktionen eine Rolle ausführen darf. Gehe dabei vom geringsten erforderlichen Zugriff aus. Wenn das Lager Aufträge nur lesen muss, erhält es keine allgemeine Bearbeitungsberechtigung, nur weil ein Formular bereits vorhanden ist.
Prüfe neben den üblichen Aktionen auch Funktionen, die leicht übersehen werden:
- Exporte und Downloads
- Massenaktionen für mehrere Datensätze
- Wiederherstellung gelöschter Datensätze
- Verknüpfung oder Trennung verwandter Datensätze
- individuelle Aktionen innerhalb von Tabellen und Detailseiten
Eine allgemeine Bearbeitungsberechtigung sollte nicht stillschweigend als Freigabe für jede individuelle Aktion dienen. Wenn eine Funktion eine eigene fachliche Wirkung hat, verdient sie eine eigene Berechtigungsentscheidung.
Den erlaubten Datensatzumfang getrennt festlegen
Danach definierst du, auf welche Datensätze eine erlaubte Aktion angewendet werden darf. Häufige Grenzen sind Eigentümer, Team, Standort, Organisation oder Mandant. Diese Zuordnung sollte aus den Daten eindeutig hervorgehen und nicht nur aus einer Auswahl in der Oberfläche abgeleitet werden.
Verwende dieselbe fachliche Regel für Listenabfragen und Einzelprüfungen. Wenn ein Benutzer nur Aufträge seines Standorts sehen darf, muss diese Grenze in der Übersicht ebenso gelten wie beim direkten Öffnen, Bearbeiten oder Exportieren eines Auftrags.
Sensible Informationen separat behandeln
Manche Rollen dürfen einen Datensatz verwenden, aber nicht jede darin enthaltene Information. Das Lager braucht beispielsweise eine Lieferadresse, jedoch möglicherweise keine internen Konditionen. In solchen Fällen solltest du sensible Felder nicht lediglich optisch unauffällig platzieren.
Definiere ausdrücklich, welche Rolle ein Feld sehen und welche es ändern darf. Bei besonders sensiblen Daten kann eine getrennte Ansicht oder ein eigener fachlicher Bereich verständlicher sein als ein großes Formular mit vielen bedingten Feldern. Die Oberfläche wird dadurch oft einfacher, und die Berechtigungsregel lässt sich leichter testen.
Prüfe alle Einstiege zu einem Datensatz
Filament-Resources bestehen selten nur aus einer Tabellenansicht und einem Bearbeitungsformular. Derselbe Datensatz kann über Verknüpfungen, Suchfunktionen, Widgets oder Aktionen erreichbar sein. Jede zusätzliche Oberfläche muss dieselben Zugriffsgrenzen respektieren.
Gehe bei der Abnahme deshalb mindestens diese Einstiege durch:
- Navigation und Resource-Übersicht
- direkte URL zu Ansicht und Bearbeitung
- globale Suche und Suchergebnisse
- Relation Manager für verknüpfte Datensätze
- Auswahlfelder, die andere Datensätze laden
- Dashboard-Widgets und Kennzahlen
- Exporte, Downloads und Massenaktionen
- Benachrichtigungen mit Links auf geschützte Datensätze
Gerade Widgets und Auswahlfelder werden leicht vergessen, weil sie nicht wie klassische Detailseiten wirken. Trotzdem können sie Namen, Summen oder andere Informationen aus Datensätzen anzeigen, die für die betreffende Rolle außerhalb ihres erlaubten Bereichs liegen.
Vermeide eine eigene Rolle für jede Ausnahme
Wächst für jeden Sonderfall eine neue Rolle, entstehen bald Kombinationen wie Vertrieb Nord mit Export, Vertrieb Nord ohne Export und Vertrieb Nord Vertretung. Das System bildet dann Personen und Einzelfälle statt stabiler Verantwortlichkeiten ab.
Trenne stattdessen die allgemeine Fähigkeit vom fachlichen Kontext. Die Rolle legt etwa fest, dass der Vertrieb Kundendaten bearbeiten darf. Eine Zuordnung bestimmt, für welches Gebiet das gilt. Eine zusätzliche, klar benannte Berechtigung kann den Export freischalten, wenn diese Fähigkeit nur wenige Personen benötigen.
Sonderrechte sollten nachvollziehbar vergeben und wieder entzogen werden können. Wenn ein Benutzer vorübergehend eine Vertretung übernimmt, muss erkennbar sein, warum er zusätzliche Datensätze sieht und wann diese Ausnahme endet. Das ist weniger spektakulär als ein neues Rollenpaket, aber im Alltag erheblich nützlicher.
Teste Verbote genauso sorgfältig wie erlaubte Abläufe
Viele Abnahmen prüfen nur, ob ein berechtigter Benutzer seine Arbeit erledigen kann. Für Zugriffskontrollen ist die Gegenprobe ebenso wichtig: Kann ein Benutzer etwas erreichen, das ausdrücklich außerhalb seiner Rolle liegt?
Aus der Berechtigungsmatrix leitest du positive und negative Testfälle ab. Für eine Vertriebsrolle könnten sie so aussehen:
- Ein zugewiesener Kunde erscheint in der Liste und lässt sich bearbeiten.
- Ein nicht zugewiesener Kunde erscheint weder in der Liste noch in der Suche.
- Die direkte URL eines fremden Kundendatensatzes führt nicht zu dessen Inhalt.
- Ein Export enthält ausschließlich erlaubte Datensätze oder steht der Rolle gar nicht zur Verfügung.
- Eine Massenaktion kann keine Datensätze außerhalb des erlaubten Bereichs erfassen.
- Verknüpfte Aufträge und Dashboard-Zahlen berücksichtigen dieselbe Datensatzgrenze.
Automatisierte Tests eignen sich besonders für Policies und Datensatzgrenzen, weil diese Regeln bei späteren Änderungen leicht unbemerkt aufweichen können. Ein ergänzender Test im Browser prüft, ob Filament die erlaubten und verbotenen Funktionen verständlich darstellt. Beide Testarten untersuchen unterschiedliche Fehlerklassen.
Wann eine einfache Lösung genügt
Nicht jedes interne Adminpanel benötigt ein fein verzweigtes Rollenmodell. Wenn ein kleines Team mit identischen Aufgaben auf denselben Datenbestand zugreift, kann eine einzelne interne Rolle mit klaren Policies genügen. Komplexität auf Vorrat verbessert keine Sicherheit.
Eine Erweiterung ist erst nötig, wenn eine konkrete fachliche Grenze auftaucht:
- Unterscheiden sich nur die erlaubten Aktionen, ergänzt du Aktionsrechte.
- Unterscheidet sich der sichtbare Datenbestand, ergänzt du Datensatzgrenzen.
- Unterscheidet sich der Zugriff auf einzelne Informationen, planst du Feld- oder Bereichsrechte.
- Gibt es zeitlich begrenzte Ausnahmen, modellierst du sie ausdrücklich statt dauerhaft neue Rollen anzulegen.
So bleibt das Modell so klein wie möglich und so genau wie nötig. Ein Rollen- und Berechtigungspaket kann die technische Verwaltung erleichtern, nimmt dir diese fachlichen Entscheidungen aber nicht ab.
Fazit: Berechtigungen beginnen bei der fachlichen Grenze
Ein sicheres Filament-Adminpanel verbindet serverseitige Aktionsprüfungen mit klar begrenzten Datensatzabfragen. Rollen beschreiben dabei stabile Verantwortlichkeiten, während Zuordnungen wie Team, Standort oder Mandant den erlaubten Datenbereich festlegen. Ausgeblendete Navigation, Buttons und Felder machen diese Regeln für Benutzer verständlich, ersetzen sie jedoch nicht.
Beginne deshalb mit einer konkreten Berechtigungsmatrix und teste jeden erlaubten sowie verbotenen Weg. Wenn direkte URLs, Suche, Relationen, Exporte und Massenaktionen dieselben Grenzen einhalten, ist die Zugriffskontrolle belastbar. Wenn nur der Menüpunkt verschwunden ist, hast du vor allem aufgeräumt.
Häufige Fragen
Kurz beantwortet, damit du schneller einschätzen kannst, was für dein Projekt wichtig ist.
Reicht es, nicht erlaubte Filament-Resources und Aktionen auszublenden?
Nein. Das Ausblenden verbessert die Bedienung, ersetzt aber keine serverseitige Prüfung. Policies und Datensatzgrenzen müssen den Zugriff auch über direkte URLs, Suche, Relationen und andere Einstiege verhindern.
Warum brauche ich sowohl Policies als auch begrenzte Abfragen?
Eine Policy schützt eine konkrete Aktion auf einem Datensatz. Die begrenzte Abfrage verhindert zusätzlich, dass unzulässige Datensätze bereits in Listen, Suchergebnissen, Auswahlfeldern oder Widgets erscheinen.
Sollte jede Person eine eigene Rolle erhalten?
In der Regel nicht. Rollen sollten stabile Verantwortlichkeiten abbilden. Persönliche Zuständigkeiten und Datensatzgrenzen lassen sich besser über Teams, Standorte, Mandanten oder direkte Zuordnungen steuern.
Wie teste ich Filament-Berechtigungen sinnvoll?
Leite positive und negative Testfälle aus deiner Berechtigungsmatrix ab. Prüfe erlaubte Datensätze, fremde Datensätze, direkte URLs, Suche, Exporte, Massenaktionen, Relationen und Widgets jeweils mit den betroffenen Rollen.