Menüs im Backend kommen häufig vom Server: Jede Rolle sieht andere Einstiegspunkte, und neue Seiten erfordern kein Frontend-Release. Die Aufgabe ist nicht, einfach zu rendern, was ankommt, sondern Menü, Routen und Aktionen an dieselben Regeln zu binden.

Der Menüvertrag

Das Menü kommt als Gruppen und Einträge. Jeder Eintrag trägt Pfad, Beschriftung oder Beschriftungsschlüssel, Icon, Gruppe, Reihenfolge, Versteckt-Markierung, Berechtigungscodes und Untereinträge. Gruppen bestimmen die Reihenfolge in der Seitenleiste, die Verschachtelung endet bei vier Ebenen, damit eine fehlerhafte Nutzlast die Navigation nicht sprengt.

Externe Einträge deklarieren Adresse und Öffnungsart: neues Fenster, gleiches Fenster oder eingebettet. Einbetten funktioniert nur bei Seiten, die es erlauben — sendet eine Seite X-Frame-Options: DENY, bleibt der Bereich leer.

Fehlertoleranz gehört ebenfalls ins Frontend: ungewöhnliche Pfade, unbekannte Icons und zu tiefe Untereinträge werden normalisiert und hinterlassen eine lesbare Warnliste. Beim Anschluss einer echten API liest man diese Liste, statt auf eine Fehlermeldung von Nutzern zu warten.

Routen kennen nur registrierte Seiten

Dynamische Routen beziehen ihre Komponenten aus einem lokalen Register: Die API kann auf eine registrierte Seite verweisen, aber keinen neuen Code einführen. Fehlende Anmeldung oder Berechtigung endet auf der Anmeldeseite oder in einem 403, nie in einer leeren Seite.

Drei Ebenen, ein Regelwerk

  • Menü: Einträge werden über Berechtigungscodes gefiltert, nicht verfügbare Einstiegspunkte erscheinen nicht.
  • Routen: Wer die URL direkt eingibt, läuft in dieselbe Prüfung und landet bei 403.
  • Aktionen: <Can permission="customer:create"> deckt Vorgänge wie Anlegen und Exportieren ab und zeigt einen deaktivierten Zustand statt still zu scheitern.

Berechtigungscodes unterstützen * für alles, module:* für ein ganzes Modul und exakte Treffer, sodass Rollenunterschiede in einer Liste stehen. Die Dokumentation enthält den vollständigen Vertrag, und in der Live-Demo lassen sich zwei Konten vergleichen: An derselben Adresse sieht der Administrator das Audit-Log, das Testkonto erhält 403.