InfraGuard

Навигация · Меню по ролям

Меню InfraGuard, построенное вокруг ролей и управляемое базой данных (infr_sitemap + min_req), — 8 ролевых областей и почему граница роли совпадает с границей прав.

Обзор — назначение

Верхняя навигация InfraGuard построена как информационная архитектура (ИА) с приоритетом роли: сначала она ветвится по роли (рабочей области), а затем разворачивается в рабочие процессы внутри каждой области. Три принципа:

  1. Меню управляется базой данных, а не задано в коде. Каждый узел меню читается из таблицы infr_sitemap (принадлежит приложению, независима). В Blade ничего не «зашито».
  2. Граница роли = граница прав. Значение min_req каждого узла (минимальный user_level) и есть линия контроля доступа. Узел показывается только при user_level >= min_req, и то же правило принудительно применяется на стороне сервера для маршрута (эшелонированная защита).
  3. Подписи всегда проходят через ключи перевода. Экранный текст разрешается через __() / Locales::menuLabel() для всех 8 языков.

Метрики (CPU, load, пятиминутные окна, …) не являются пунктами меню верхнего уровня — они живут как вкладки сущностей и фильтры внутри каждого экрана. Разделение отвечает на вопрос «кто (какая роль) что делает», а не «какая метрика».

В InfraGuard «домен» означает только веб-TLD (aaa.bbb.com). Разделение работы по зоне ответственности называется «роль / область». 8 пунктов меню верхнего уровня — это и есть те самые ролевые области.


Когда применять


Компоновка

Меню располагается горизонтально в верхней панели (infr-topbar). Слева направо:

Зона Содержимое
Бренд Логотип InfraGuard (щит + пульс мониторинга) → переход к Обзору (/)
Меню ролей infr-nav — 8 ролевых областей, при наведении раскрывается панель подпунктов
Действия справа переключатель мобильного меню · переключатель языка · переключатель темы · меню пользователя

Каждый пункт верхнего уровня отрисовывается как значок MDI + подпись + (если есть дочерние узлы) шеврон; дочерние узлы появляются в выпадающей панели (infr-nav__panel). Когда текущий путь совпадает с href дочернего узла, пункт верхнего уровня получает класс is-active (Обзор активен только при пути ровно /).

8 ролевых областей

Это дерево верхнего уровня, которое строит SitemapSeeder. При входе в область к <body> применяется body_class, ограничивая область действия стилей страницы.

# Ролевая область Ответственный body_class Мин. user_level
1 Обзор общая infr-overview 1
2 Инфраструктура эксплуатация инфраструктуры infr-infra 1
3 Сервисы эксплуатация сервисов infr-service 1
4 Безопасность служба безопасности infr-security 2
5 Резервное копирование и восстановление инфраструктура (также) infr-backup 2
6 Активы общий справочник (CMDB) infr-asset 1
7 Администрирование администратор infr-admin 10
8 Разработка super_admin infr-dev 9

Подпункты по областям

У каждого подпункта собственное значение min_req (обычно совпадает с родительским, иногда повышено).

Инфраструктура (min_req 1)

Пункт Путь min_req
Состояние /infra/health 1
Серверы /infra/servers 1
Хранилище и RAID /infra/storage 1
Соединения по портам /infra/traffic/ports 1
IP-соединения /infra/traffic/ips 1
Трафик /infra/traffic/net 1
Оповещения /infra/alert 1

Сервисы (min_req 1)

Пункт Путь min_req
Обзор /service 1
Веб /service/web 1
База данных /service/database 1
Сессии /service/session 1
Каталог /service/catalog 1
Проекты /service/projects 1
Решение проблем /service/resolution 2

Безопасность (min_req 2 — у всех пунктов 2)

Пункт Путь
Обзор /security
Угрозы /security/threats
Обнаружения /security/detections
Наборы правил /security/rulesets
Межсетевой экран /security/firewall
Блок-лист и репутация /security/blocklist
Белый список /security/whitelist
Диагностика безопасности /security/diagnostics
Решение проблем /security/resolution

Резервное копирование и восстановление (min_req 2): Доска расписания /backup/board · Скрипты резервного копирования /backup/scripts · Хранилища /backup/vaults · Восстановление и проверка /backup/recovery.

Активы (min_req 1): Инвентарь /asset/inventory · Инстансы /asset/instances · Оборудование /asset/hardware · Хранилище и файлы /asset/storage.

Администрирование (min_req 10 — у всех пунктов 10): Пользователи и роли /admin/users · Коллекторы /admin/collectors · Операционная политика /admin/ops-policy · API-ключи /admin/api-keys · Правила и пороги /admin/rules · API репутации /admin/reputation-providers · ИИ-адаптеры /admin/ai-providers · Почтовые адаптеры /admin/mail-providers · SMS-адаптеры /admin/sms-providers · Локализация /admin/localization · Аудит /admin/audit.

Разработка (min_req 9 — у всех пунктов 9): Dev Overview /dev · Doctor /dev/doctor · Runtime & Leader /dev/leader · Slow Queries/Requests/Jobs/Outgoing · Exceptions · Cache · Servers · Usage · Pulse /pulse · Horizon /horizon.


Как пользоваться

Перемещение по меню

Наведите указатель на пункт верхнего уровня, чтобы открыть его панель. Клик по пункту выполняет переход на экран и применяет body_class этой области к <body>. На узких экранах меню разворачивается кнопкой-гамбургером в правом верхнем углу (data-nav-toggle).

Что видит ваш уровень

При входе промежуточный слой InfrAuth синхронизирует users.user_level в ключ сессии infr_user_level. При отрисовке Menu::for_user($level) обходит дерево и рекурсивно скрывает любой узел, для которого min_req > your level. Например:

У Разработки (9) и Администрирования (10) разные пороги. super_admin ровно с уровнем 9 видит Разработку, но не Администрирование. Администратор (10) видит и то и другое.

Добавление и перестройка меню (админ/разработчик)

Интерфейса для редактирования меню пока нет. Источник истины для дерева — код (database/seeders/SitemapSeeder.php), и при каждом запуске сидер удаляет все строки и создаёт их заново (каноническая пересинхронизация).

# После правки дерева выполните пересинхронизацию (затрагивает только infr_sitemap — унаследованные данные в безопасности)
php artisan db:seed --class=SitemapSeeder

В конце сидер вызывает Menu::flush(), поэтому изменения вступают в силу немедленно. Если новый пункт показывает исходное (английское) имя, значит для него нет ключа перевода — добавьте его в resources/lang/{ko,en}/menu.php по правилу Str::slug(name, '_') (например, Storage & RAID → storage_raid).

Никогда не запускайте migrate:fresh. InfraGuard использует общее подключение с унаследованной MySQL от stats-design. Чтобы обновить только меню, применяйте исключительно db:seed --class=SitemapSeeder.


Источники данных

Таблица infr_sitemap

Независимая таблица, принадлежащая приложению (отличается от унаследованной sitemap без префикса). Модель: App\Models\Infr\InfrSitemap.

Столбец Значение
parent_id 0 = верхний уровень, иначе id родительского узла
seq порядок сортировки среди соседей
depth 0 = ролевая область, 1 = подпункт
name исходное имя (источник ключа подписи)
href путь ссылки (# = родитель без ссылки)
icon глиф MDI (например, mdi-server)
body_class только верхний уровень — класс <body> при входе
is_view 1, чтобы включить узел в дерево
min_req минимальный user_level (граница прав)

App\Support\Menu — построение дерева и кеш

В кеше хранится исходное значение name; перевод выполняется во время отрисовки через Locales::menuLabel(). Поэтому переключение языка не требует сброса кеша. И наоборот, добавление или переименование узлов требует повторного запуска сидера (который сбрасывает кеш).

Перевод подписей

App\Support\Locales::menuLabel($name) ищет ключ menu. + Str::slug($name, '_'). Если ключ существует, значение переводится, иначе возвращается исходное имя (безопасный откат). Пакеты находятся в resources/lang/{locale}/menu.php.

// В шаблоне отрисовки (nav.blade.php)
{{ \App\Support\Locales::menuLabel($top['name']) }}
// "Storage & RAID" → __('menu.storage_raid') → "Storage & RAID" (en) / "Хранилище и RAID" (ru)

Сессия и промежуточные слои


Доступ

Уровень (user_level) Псевдоним Видно в меню
1 demo/viewer Обзор · Инфраструктура · Сервисы · Активы (в основном чтение)
5 staff + Безопасность · Резервное копирование и восстановление
9 super_admin + Разработка
10 admin + Администрирование (и Разработка)

Определения уровней см. в Уровни RBAC; управление ролями и командами — в Роли и команды.


Диагностика и частые вопросы

Пункт меню отсутствует. Обычно причина — недостаточный уровень. Убедитесь, что ваш user_level ≥ значения min_req этого узла (см. таблицы выше). Администраторы меняют уровни в разделе Пользователи и команды.

Только что добавленный пункт меню отображается английским (исходным) именем. В пакете menu.php нет ключа перевода. Добавьте его и в resources/lang/ko/menu.php, и в en/menu.php по правилу Str::slug(name,'_'). Без ключа экран всё равно безопасно работает с исходным именем.

Я запустил сидер, но меню не изменилось. Возможно, кеш устарел. В конце сидер вызывает Menu::flush(), но можно также выполнить php artisan cache:clear. Если Redis остановлен, Menu на каждый запрос откатывается к build(), поэтому кеширование не может быть причиной.

Я переключил язык, но не изменились только подписи меню. Подписи разрешаются во время отрисовки и не кешируются. Проверьте, есть ли нужный ключ в menu.php целевого языка. Если нет, посмотрите состояние активации и перевода на странице Локализация.

Может ли кто-то попасть на скрытый экран, введя URL вручную? Нет. Даже когда меню скрыто, промежуточный слой маршрута (infr.level:N и т. п.) возвращает 403 на стороне сервера.


Связанные материалы

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