InfraGuard

Navigation · Menu orienté rôles

Le menu d’InfraGuard, orienté rôles et piloté par la base de données (infr_sitemap + min_req) — les 8 zones de rôle et pourquoi la frontière de rôle est la frontière de permissions.

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 :

  1. 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.
  2. Frontière de rôle = frontière de permissions. Le min_req de chaque nœud (le user_level minimal) est la ligne de contrôle d’accès. Un nœud n’est affiché que si user_level >= min_req, et la même règle est appliquée côté serveur sur la route (défense en profondeur).
  3. 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


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 :

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 exclusivement db: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

Le cache stocke le name brut ; la traduction a lieu au rendu via Locales::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


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)

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

역할별로 묶인 상단 내비게이션
역할별로 묶인 상단 내비게이션
오른쪽 끝 계정 메뉴
오른쪽 끝 계정 메뉴