Übersicht — was es leistet
Die Hauptnavigation von InfraGuard ist eine rollenorientierte Informationsarchitektur (IA): Sie verzweigt zuerst nach Rolle (Arbeitsbereich) und entfaltet sich dann innerhalb jedes Bereichs zu Arbeitsabläufen. Drei Prinzipien:
- Das Menü ist datenbankgesteuert, nicht fest verdrahtet. Jeder Menüknoten wird aus der Tabelle
infr_sitemapgelesen (anwendungseigen, unabhängig). Nichts ist in Blade eingebacken. - Rollengrenze = Berechtigungsgrenze. Das
min_reqjedes Knotens (das minimaleuser_level) ist die Linie der Zugriffskontrolle. Ein Knoten wird nur angezeigt, wennuser_level >= min_reqgilt, und dieselbe Regel wird serverseitig auf der Route durchgesetzt (gestaffelte Verteidigung). - Beschriftungen laufen immer über Übersetzungsschlüssel. Der Text auf dem Bildschirm wird über
__()/Locales::menuLabel()für alle 8 Sprachen aufgelöst.
Kennzahlen (CPU, Load, 5-Minuten-Fenster, …) sind keine Menüpunkte der obersten Ebene — sie leben als Entitäts-Tabs und Filter innerhalb der einzelnen Bildschirme. Die Aufteilung folgt der Frage „wer (welche Rolle) tut was“, nicht „welche Kennzahl“.
In InfraGuard bedeutet „Domain“ ausschließlich eine Web-TLD (
aaa.bbb.com). Die nach Zuständigkeit aufgeteilte Arbeit heißt „Rolle / Bereich“. Die 8 Menüpunkte der obersten Ebene sind genau diese Rollenbereiche.
Wann Sie es verwenden
- Bei der ersten Anmeldung, um zu lernen, wo was zu finden ist.
- Um zu klären, warum ein Bildschirm fehlt (unzureichendes Level oder Sprach-Fallback).
- Wenn Sie das Menü erweitern oder umbauen und den Seeder erneut ausführen müssen (Admin/Dev).
- Um zu prüfen, was Benutzern eines anderen Levels angezeigt wird.
Aufbau
Das Menü liegt waagerecht in der Kopfleiste (infr-topbar). Von links nach rechts:
| Bereich | Inhalt |
|---|---|
| Marke | InfraGuard-Logo (Schild + Monitoring-Puls) → führt zur Übersicht (/) |
| Rollenmenü | infr-nav — 8 Rollenbereiche, beim Überfahren öffnet sich ein Panel mit Unterpunkten |
| Aktionen rechts | Umschalter für das mobile Menü · Sprachumschalter · Theme-Umschalter · Benutzermenü |
Jeder Punkt der obersten Ebene wird als MDI-Symbol + Beschriftung + (sofern Unterpunkte vorhanden) Chevron gerendert; die Unterpunkte erscheinen in einem Aufklapp-Panel (infr-nav__panel). Stimmt der aktuelle Pfad mit dem href eines Unterpunkts überein, erhält der Punkt der obersten Ebene die Klasse is-active (die Übersicht ist nur aktiv, wenn der Pfad exakt / lautet).
Die 8 Rollenbereiche
Dies ist der Baum der obersten Ebene, den SitemapSeeder aufbaut. Die body_class wird beim Betreten eines Bereichs auf <body> angewendet und begrenzt so den Geltungsbereich der Seitenstile.
| # | Rollenbereich | Zuständig | body_class |
Min. user_level |
|---|---|---|---|---|
| 1 | Übersicht | gemeinsam | infr-overview |
1 |
| 2 | Infrastruktur | Infrastrukturbetrieb | infr-infra |
1 |
| 3 | Service | Servicebetrieb | infr-service |
1 |
| 4 | Sicherheit | Sicherheitsbetrieb | infr-security |
2 |
| 5 | Backup und Wiederherstellung | Infrastruktur (ebenfalls) | infr-backup |
2 |
| 6 | Assets | gemeinsame Referenz (CMDB) | infr-asset |
1 |
| 7 | Verwaltung | Admin | infr-admin |
10 |
| 8 | Entwicklung | super_admin | infr-dev |
9 |
Unterpunkte je Bereich
Jeder Unterpunkt trägt sein eigenes min_req (meist dasselbe wie beim übergeordneten Punkt, gelegentlich angehoben).
Infrastruktur (min_req 1)
| Punkt | Pfad | min_req |
|---|---|---|
| Zustand | /infra/health |
1 |
| Server | /infra/servers |
1 |
| Speicher und RAID | /infra/storage |
1 |
| Port-Verbindungen | /infra/traffic/ports |
1 |
| IP-Verbindungen | /infra/traffic/ips |
1 |
| Traffic | /infra/traffic/net |
1 |
| Alarme | /infra/alert |
1 |
Service (min_req 1)
| Punkt | Pfad | min_req |
|---|---|---|
| Übersicht | /service |
1 |
| Web | /service/web |
1 |
| Datenbank | /service/database |
1 |
| Sitzungen | /service/session |
1 |
| Katalog | /service/catalog |
1 |
| Projekte | /service/projects |
1 |
| Problemlösung | /service/resolution |
2 |
Sicherheit (min_req 2 — alle Punkte 2)
| Punkt | Pfad |
|---|---|
| Übersicht | /security |
| Bedrohungen | /security/threats |
| Erkennungen | /security/detections |
| Regelsätze | /security/rulesets |
| Firewall | /security/firewall |
| Sperrliste und Reputation | /security/blocklist |
| Whitelist | /security/whitelist |
| Sicherheitsdiagnose | /security/diagnostics |
| Problemlösung | /security/resolution |
Backup und Wiederherstellung (min_req 2): Zeitplan-Board /backup/board · Backup-Skripte /backup/scripts · Tresore /backup/vaults · Wiederherstellung und Prüfung /backup/recovery.
Assets (min_req 1): Inventar /asset/inventory · Instanzen /asset/instances · Hardware /asset/hardware · Speicher und Dateien /asset/storage.
Verwaltung (min_req 10 — alle Punkte 10): Benutzer und Rollen /admin/users · Collectors /admin/collectors · Betriebsrichtlinie /admin/ops-policy · API-Schlüssel /admin/api-keys · Regeln und Schwellenwerte /admin/rules · Reputations-API /admin/reputation-providers · KI-Adapter /admin/ai-providers · Mail-Adapter /admin/mail-providers · SMS-Adapter /admin/sms-providers · Lokalisierung /admin/localization · Audit /admin/audit.
Entwicklung (min_req 9 — alle Punkte 9): Dev Overview /dev · Doctor /dev/doctor · Runtime & Leader /dev/leader · Slow Queries/Requests/Jobs/Outgoing · Exceptions · Cache · Servers · Usage · Pulse /pulse · Horizon /horizon.
Vorgehen
Navigieren
Fahren Sie über einen Punkt der obersten Ebene, um sein Panel zu öffnen. Ein Klick auf einen Punkt führt zum Bildschirm und wendet die body_class dieses Bereichs auf <body> an. Auf schmalen Bildschirmen klappt das Hamburger-Symbol oben rechts (data-nav-toggle) das Menü auf.
Was Ihr Level sieht
Bei der Anmeldung synchronisiert die Middleware InfrAuth users.user_level in den Sitzungsschlüssel infr_user_level. Beim Rendern durchläuft Menu::for_user($level) den Baum und blendet rekursiv jeden Knoten mit min_req > your level aus. Zum Beispiel:
- Level 1 (demo): sieht Übersicht · Infrastruktur · Service · Assets — aber nicht Sicherheit (2), Backup (2), Verwaltung (10) oder Entwicklung (9).
- Level 5 (staff): zusätzlich Sicherheit · Backup und Wiederherstellung (beide 2).
- Level 10 (admin): alles, einschließlich Verwaltung (10) und Entwicklung (9).
Entwicklung (9) und Verwaltung (10) haben unterschiedliche Schwellen. Ein super_admin mit genau Level 9 sieht Entwicklung, aber nicht Verwaltung. Ein Admin (10) sieht beides.
Menü erweitern oder umbauen (Admin/Dev)
Eine Oberfläche zum Bearbeiten des Menüs gibt es noch nicht. Die maßgebliche Quelle des Baums ist der Code (database/seeders/SitemapSeeder.php), und der Seeder löscht bei jedem Lauf alle Zeilen und legt sie neu an (kanonische Resynchronisierung).
# Nach dem Bearbeiten des Baums resynchronisieren (betrifft nur infr_sitemap — Altdaten bleiben unberührt)
php artisan db:seed --class=SitemapSeeder
Der Seeder ruft am Ende Menu::flush() auf, Änderungen wirken also sofort. Zeigt ein neuer Punkt seinen rohen (englischen) Namen, fehlt ihm ein Übersetzungsschlüssel — legen Sie einen in resources/lang/{ko,en}/menu.php nach der Regel Str::slug(name, '_') an (z. B. Storage & RAID → storage_raid).
Führen Sie niemals
migrate:freshaus. InfraGuard teilt sich eine Verbindung mit der alten stats-design-MySQL. Um ausschließlich das Menü zu aktualisieren, verwenden Sie alleindb:seed --class=SitemapSeeder.
Datenquellen
Die Tabelle infr_sitemap
Eine unabhängige, anwendungseigene Tabelle (verschieden von der alten, präfixlosen sitemap). Modell: App\Models\Infr\InfrSitemap.
| Spalte | Bedeutung |
|---|---|
parent_id |
0 = oberste Ebene, sonst die id des übergeordneten Knotens |
seq |
Sortierreihenfolge unter Geschwistern |
depth |
0 = Rollenbereich, 1 = Unterpunkt |
name |
roher Name (Quelle des Beschriftungsschlüssels) |
href |
Linkpfad (# = übergeordneter Knoten ohne Link) |
icon |
MDI-Glyphe (z. B. mdi-server) |
body_class |
nur oberste Ebene — <body>-Klasse beim Betreten |
is_view |
1, um ihn in den Baum aufzunehmen |
min_req |
minimales user_level (Berechtigungsgrenze) |
App\Support\Menu — Baumaufbau + Cache
Menu::tree()— liest die Zeilen mitis_view=1, sortiert nachseq,id, baut daraus einen rekursiven Baum und legt ihn mitrememberForever(Schlüsselinfr:menu:v2) im Cache ab. Ist Redis nicht verfügbar, weicht die Methode auf einbuild()ohne Cache aus.Menu::for_user($level)— filtert den Baum rekursiv nachmin_req > $level.Menu::flush()— macht den Cache ungültig (wird vom Seeder aufgerufen).
Der Cache speichert den rohen
name; übersetzt wird erst beim Rendern überLocales::menuLabel(). Ein Sprachwechsel erfordert daher kein Leeren des Caches. Umgekehrt verlangt das Hinzufügen oder Umbenennen von Knoten einen erneuten Seeder-Lauf (der den Cache leert).
Übersetzung der Beschriftungen
App\Support\Locales::menuLabel($name) schlägt den Schlüssel menu. + Str::slug($name, '_') nach. Existiert der Schlüssel, wird übersetzt, andernfalls kommt der rohe Name zurück (sicherer Fallback). Die Pakete liegen unter resources/lang/{locale}/menu.php.
// Im Rendering (nav.blade.php)
{{ \App\Support\Locales::menuLabel($top['name']) }}
// "Storage & RAID" → __('menu.storage_raid') → "Storage & RAID" (en) / "Speicher und RAID" (de)
Sitzung und Middleware
InfrAuth— synchronisiert bei der Authentifizierungusers.user_level→ Sitzunginfr_user_level. Das ist die Eingabe für den Menüfilter.InfrLevel(infr.level:N) — Routen-Gate. Liefert 403, wenninfr_user_level < N(serverseitige Durchsetzung, unabhängig vom Ausblenden im Menü).InfrAdmin/InfrDev— schützen die Routengruppen Verwaltung (≥10) und Entwicklung (≥9).
Zugriff
Level (user_level) |
Alias | Im Menü sichtbar |
|---|---|---|
| 1 | demo/viewer | Übersicht · Infrastruktur · Service · Assets (überwiegend lesend) |
| 5 | staff | + Sicherheit · Backup und Wiederherstellung |
| 9 | super_admin | + Entwicklung |
| 10 | admin | + Verwaltung (und Entwicklung) |
- Das Ausblenden im Menü ist nur eine Bequemlichkeit und eine erste Verteidigungslinie. Die eigentliche Kontrolle setzt der Server über die Middleware
infr.level:N/InfrAdmin/InfrDevje Route durch (auch die direkte Eingabe der URL liefert weiterhin 403). - Destruktive bzw. sicherheitsrelevante Aktionen (Sperren, Wiederherstellen, Regeländerungen, …) werden innerhalb der Bildschirme üblicherweise noch einmal über ein eigenes Schreiblevel abgesichert (z. B. Schreiben ≥2, Admin ≥10) und im Audit-Log festgehalten.
Zu den Leveldefinitionen siehe RBAC-Level; zur Verwaltung von Rollen und Teams siehe Rollen und Teams.
Fehlersuche und FAQ
Ein Menüpunkt fehlt.
Meist ein zu niedriges Level. Prüfen Sie, ob Ihr user_level ≥ dem min_req dieses Knotens ist (siehe die Tabellen oben). Administratoren passen Level unter Benutzer und Teams an.
Ein neu hinzugefügter Menüpunkt zeigt seinen englischen (rohen) Namen.
Dem Paket menu.php fehlt ein Übersetzungsschlüssel. Legen Sie ihn nach der Regel Str::slug(name,'_') sowohl in resources/lang/ko/menu.php als auch in en/menu.php an. Fehlt der Schlüssel, funktioniert der Bildschirm mit dem rohen Namen dennoch gefahrlos.
Ich habe den Seeder ausgeführt, aber das Menü hat sich nicht geändert.
Möglicherweise ist der Cache veraltet. Der Seeder ruft am Ende Menu::flush() auf, Sie können aber auch php artisan cache:clear versuchen. Ist Redis ausgefallen, weicht Menu pro Anfrage auf build() aus — dann kann das Caching nicht die Ursache sein.
Ich habe die Sprache gewechselt, aber nur die Menübeschriftungen haben sich nicht geändert.
Beschriftungen werden beim Rendern aufgelöst und nicht zwischengespeichert. Prüfen Sie, ob die menu.php der Zielsprache den Schlüssel enthält. Falls nicht, kontrollieren Sie Aktivierungs- und Übersetzungsstand auf der Seite Lokalisierung.
Kann jemand einen ausgeblendeten Bildschirm durch Eingabe der URL erreichen?
Nein. Auch bei ausgeblendetem Menü liefert die Routen-Middleware (infr.level:N usw.) serverseitig 403 zurück.
Verwandte Themen
- RBAC-Level — wie
user_levelundmin_reqausgewertet werden - Rollen und Teams — Rollen, Teams und Eigentümer
- Lokalisierung — Sprachwechsel und Fallback
- Theme — Tokens für hell/dunkel
- Benutzer und Teams (Verwaltung) — Level anpassen
- Übersicht (Startseite) — der Startbildschirm mit dem Gesamtzustand

