Vue d’ensemble — à quoi cela sert
La navigation supérieure d’InfraGuard repose sur une architecture de l’information (AI) orientée rôles : elle se ramifie d’abord par rôle (zone de travail), puis se déploie en flux de tâches à l’intérieur de chaque zone. Trois principes :
- Le menu est piloté par la base de données, pas codé en dur. Chaque nœud de menu est lu depuis la table
infr_sitemap(propriété de l’application, indépendante). Rien n’est figé dans Blade. - Frontière de rôle = frontière de permissions. Le
min_reqde chaque nœud (leuser_levelminimal) est la ligne de contrôle d’accès. Un nœud n’est affiché que siuser_level >= min_req, et la même règle est appliquée côté serveur sur la route (défense en profondeur). - Les libellés passent toujours par des clés de traduction. Le texte affiché est résolu via
__()/Locales::menuLabel()pour les 8 langues.
Les métriques (CPU, charge, fenêtres de 5 minutes, …) ne sont pas des entrées de menu de premier niveau : elles vivent sous forme d’onglets d’entité et de filtres à l’intérieur de chaque écran. La séparation répond à « qui (quel rôle) fait quoi », et non à « quelle métrique ».
Dans InfraGuard, « domaine » désigne uniquement un TLD web (
aaa.bbb.com). Le découpage du travail par responsabilité s’appelle « rôle / zone ». Les 8 entrées de menu de premier niveau sont ces zones de rôle.
Quand l’utiliser
- À la première connexion, pour apprendre où se trouve quoi.
- Pour diagnostiquer pourquoi un écran est absent (niveau insuffisant ou repli de langue).
- Lorsqu’il faut ajouter ou restructurer le menu et relancer le semeur (admin/dev).
- Pour vérifier ce qui est exposé aux utilisateurs d’un autre niveau.
Disposition
Le menu s’affiche horizontalement dans la barre supérieure (infr-topbar). De gauche à droite :
| Zone | Contenu |
|---|---|
| Marque | Logo InfraGuard (bouclier + pulsation de supervision) → mène à Vue d’ensemble (/) |
| Menu de rôles | infr-nav — 8 zones de rôle ; le survol révèle un panneau de sous-entrées |
| Actions de droite | bascule du menu mobile · sélecteur de langue · bascule de thème · menu utilisateur |
Chaque entrée de premier niveau est rendue sous forme d’icône MDI + libellé + (si elle a des enfants) un chevron ; les enfants apparaissent dans un panneau déroulant (infr-nav__panel). Lorsque le chemin courant correspond au href d’un enfant, l’entrée de premier niveau reçoit is-active (Vue d’ensemble n’est active que si le chemin est exactement /).
Les 8 zones de rôle
Voici l’arbre de premier niveau que construit SitemapSeeder. La body_class est appliquée à <body> à l’entrée dans une zone, ce qui délimite la portée des styles de la page.
| # | Zone de rôle | Responsable | body_class |
user_level minimal |
|---|---|---|---|---|
| 1 | Vue d’ensemble | commun | infr-overview |
1 |
| 2 | Infrastructure | exploitation infrastructure | infr-infra |
1 |
| 3 | Service | exploitation des services | infr-service |
1 |
| 4 | Sécurité | exploitation sécurité | infr-security |
2 |
| 5 | Sauvegarde et restauration | infrastructure (également) | infr-backup |
2 |
| 6 | Actifs | référentiel commun (CMDB) | infr-asset |
1 |
| 7 | Administration | admin | infr-admin |
10 |
| 8 | Développement | super_admin | infr-dev |
9 |
Sous-entrées par zone
Chaque sous-entrée porte son propre min_req (généralement identique à celui du parent, parfois relevé).
Infrastructure (min_req 1)
| Entrée | Chemin | min_req |
|---|---|---|
| Santé | /infra/health |
1 |
| Serveurs | /infra/servers |
1 |
| Stockage et RAID | /infra/storage |
1 |
| Connexions de ports | /infra/traffic/ports |
1 |
| Connexions IP | /infra/traffic/ips |
1 |
| Trafic | /infra/traffic/net |
1 |
| Alertes | /infra/alert |
1 |
Service (min_req 1)
| Entrée | Chemin | min_req |
|---|---|---|
| Vue d’ensemble | /service |
1 |
| Web | /service/web |
1 |
| Base de données | /service/database |
1 |
| Sessions | /service/session |
1 |
| Catalogue | /service/catalog |
1 |
| Projets | /service/projects |
1 |
| Résolution des problèmes | /service/resolution |
2 |
Sécurité (min_req 2 — toutes les entrées à 2)
| Entrée | Chemin |
|---|---|
| Vue d’ensemble | /security |
| Menaces | /security/threats |
| Détections | /security/detections |
| Jeux de règles | /security/rulesets |
| Pare-feu | /security/firewall |
| Liste de blocage et réputation | /security/blocklist |
| Liste blanche | /security/whitelist |
| Diagnostic de sécurité | /security/diagnostics |
| Résolution des problèmes | /security/resolution |
Sauvegarde et restauration (min_req 2) : Tableau de planification /backup/board · Scripts de sauvegarde /backup/scripts · Coffres /backup/vaults · Restauration et validation /backup/recovery.
Actifs (min_req 1) : Inventaire /asset/inventory · Instances /asset/instances · Matériel /asset/hardware · Stockage et fichiers /asset/storage.
Administration (min_req 10 — toutes les entrées à 10) : Utilisateurs et rôles /admin/users · Collecteurs /admin/collectors · Politique d’exploitation /admin/ops-policy · Clés API /admin/api-keys · Règles et seuils /admin/rules · API de réputation /admin/reputation-providers · Adaptateurs IA /admin/ai-providers · Adaptateurs e-mail /admin/mail-providers · Adaptateurs SMS /admin/sms-providers · Localisation /admin/localization · Audit /admin/audit.
Développement (min_req 9 — toutes les entrées à 9) : Dev Overview /dev · Doctor /dev/doctor · Runtime & Leader /dev/leader · Slow Queries/Requests/Jobs/Outgoing · Exceptions · Cache · Servers · Usage · Pulse /pulse · Horizon /horizon.
Utilisation
Naviguer
Survolez une entrée de premier niveau pour ouvrir son panneau. Cliquer sur une entrée conduit à l’écran et applique la body_class de cette zone à <body>. Sur les écrans étroits, le bouton hamburger en haut à droite (data-nav-toggle) déploie le menu.
Ce que voit votre niveau
À la connexion, le middleware InfrAuth synchronise users.user_level vers la clé de session infr_user_level. Au rendu, Menu::for_user($level) parcourt l’arbre et masque récursivement tout nœud tel que min_req > your level. Par exemple :
- Niveau 1 (demo) : voit Vue d’ensemble · Infrastructure · Service · Actifs — mais pas Sécurité (2), Sauvegarde (2), Administration (10) ni Développement (9).
- Niveau 5 (staff) : les précédentes plus Sécurité · Sauvegarde et restauration (toutes deux à 2).
- Niveau 10 (admin) : tout, y compris Administration (10) et Développement (9).
Développement (9) et Administration (10) ont des seuils différents. Un super_admin exactement au niveau 9 voit Développement mais pas Administration. Un admin (10) voit les deux.
Ajouter ou restructurer le menu (admin/dev)
Il n’existe pas encore d’interface d’édition du menu. La source de vérité de l’arbre est le code (database/seeders/SitemapSeeder.php), et le semeur supprime toutes les lignes puis les recrée à chaque exécution (resynchronisation canonique).
# Après modification de l’arbre, resynchronisez (ne touche qu’à infr_sitemap — les données héritées sont préservées)
php artisan db:seed --class=SitemapSeeder
Le semeur appelle Menu::flush() à la fin : les changements prennent donc effet immédiatement. Si une nouvelle entrée affiche son nom brut (en anglais), c’est qu’il lui manque une clé de traduction — ajoutez-en une dans resources/lang/{ko,en}/menu.php en suivant la règle Str::slug(name, '_') (par exemple Storage & RAID → storage_raid).
N’exécutez jamais
migrate:fresh. InfraGuard partage une connexion avec la MySQL héritée de stats-design. Pour rafraîchir uniquement le menu, utilisez exclusivementdb:seed --class=SitemapSeeder.
Sources de données
La table infr_sitemap
Une table indépendante, propriété de l’application (distincte de la table héritée sitemap sans préfixe). Modèle : App\Models\Infr\InfrSitemap.
| Colonne | Signification |
|---|---|
parent_id |
0 = premier niveau, sinon id du nœud parent |
seq |
ordre de tri entre frères |
depth |
0 = zone de rôle, 1 = sous-entrée |
name |
nom brut (source de la clé de libellé) |
href |
chemin du lien (# = parent non cliquable) |
icon |
glyphe MDI (par exemple mdi-server) |
body_class |
premier niveau uniquement — classe de <body> à l’entrée |
is_view |
1 pour l’inclure dans l’arbre |
min_req |
user_level minimal (frontière de permissions) |
App\Support\Menu — constructeur d’arbre + cache
Menu::tree()— lit les lignesis_view=1triées parseq,id, assemble un arbre récursif et le met en cache avecrememberForever(cléinfr:menu:v2). Si Redis est indisponible, il se replie sur unbuild()sans cache.Menu::for_user($level)— filtre récursivement l’arbre selonmin_req > $level.Menu::flush()— invalide le cache (appelé par le semeur).
Le cache stocke le
namebrut ; la traduction a lieu au rendu viaLocales::menuLabel(). Ainsi, changer de langue ne nécessite aucun vidage du cache. À l’inverse, ajouter ou renommer des nœuds impose de rejouer le semeur (qui vide le cache).
Traduction des libellés
App\Support\Locales::menuLabel($name) recherche la clé menu. + Str::slug($name, '_'). Si la clé existe, elle est traduite ; sinon la fonction renvoie le nom brut (repli sûr). Les paquets se trouvent dans resources/lang/{locale}/menu.php.
// Dans le rendu (nav.blade.php)
{{ \App\Support\Locales::menuLabel($top['name']) }}
// "Storage & RAID" → __('menu.storage_raid') → "Storage & RAID" (en) / "Stockage et RAID" (fr)
Session et middleware
InfrAuth— à l’authentification, synchroniseusers.user_level→ sessioninfr_user_level. C’est l’entrée du filtre de menu.InfrLevel(infr.level:N) — garde de route. Renvoie 403 siinfr_user_level < N(application côté serveur, distincte du masquage du menu).InfrAdmin/InfrDev— protègent les groupes de routes Administration (≥10) et Développement (≥9).
Accès
Niveau (user_level) |
Alias | Visible dans le menu |
|---|---|---|
| 1 | demo/viewer | Vue d’ensemble · Infrastructure · Service · Actifs (surtout en lecture) |
| 5 | staff | + Sécurité · Sauvegarde et restauration |
| 9 | super_admin | + Développement |
| 10 | admin | + Administration (et Développement) |
- Le masquage du menu n’est qu’un confort et une première ligne de défense. Le contrôle réel est appliqué côté serveur par le middleware
infr.level:N/InfrAdmin/InfrDevpropre à chaque route (saisir l’URL directement renvoie tout de même 403). - Les actions destructrices ou de sécurité (blocage, restauration, modification de règles, …) sont généralement re-filtrées à l’intérieur de chaque écran par un niveau d’écriture distinct (par exemple écriture ≥2, admin ≥10) et consignées dans le journal d’audit.
Pour la définition des niveaux, voir Niveaux RBAC ; pour la gestion des rôles et des équipes, voir Rôles et équipes.
Dépannage et FAQ
Une entrée de menu est absente.
En général, un niveau insuffisant. Vérifiez que votre user_level est ≥ au min_req de ce nœud (voir les tableaux ci-dessus). Les administrateurs ajustent les niveaux dans Utilisateurs et équipes.
Une entrée de menu récemment ajoutée affiche son nom anglais (brut).
Le paquet menu.php n’a pas de clé de traduction. Ajoutez-en une à la fois dans resources/lang/ko/menu.php et dans en/menu.php en suivant la règle Str::slug(name,'_'). En l’absence de clé, l’écran fonctionne malgré tout sans risque avec le nom brut.
J’ai lancé le semeur mais le menu n’a pas changé.
Un cache périmé est possible. Le semeur appelle Menu::flush() à la fin, mais vous pouvez aussi essayer php artisan cache:clear. Si Redis est arrêté, Menu se replie sur build() à chaque requête : la mise en cache ne peut donc pas être en cause.
J’ai changé de langue mais seuls les libellés du menu n’ont pas changé.
Les libellés sont résolus au rendu, pas mis en cache. Vérifiez que le menu.php de la langue cible contient la clé. Sinon, contrôlez l’état d’activation et de traduction sur la page Localisation.
Peut-on atteindre un écran masqué en saisissant l’URL ?
Non. Même lorsque le menu est masqué, le middleware de route (infr.level:N, etc.) renvoie 403 côté serveur.
Voir aussi
- Niveaux RBAC — comment
user_leveletmin_reqsont évalués - Rôles et équipes — rôles, équipes et propriétaires
- Localisation — changement de langue et repli
- Thème — jetons clair/sombre
- Utilisateurs et équipes (admin) — ajuster les niveaux
- Vue d’ensemble (page d’accueil) — l’écran d’accueil de santé unifiée

