Админ, RBAC, аудит¶
Управленческая поверхность стоит на четырёх ролях, динамическом каталоге прав и журнале аудита с хеш-цепочкой.
Четыре роли¶
| Роль | За что отвечает |
|---|---|
superadmin |
Назначение и снятие админов, приглашения, режим доступа платформы. Единственная роль, которая это делает. |
admin |
Управление системой — авторазрешается во все права каталога |
manager |
Рассмотрение и решение заявлений граждан (gov.review) |
user |
Личный раздел (personal.view) |
RBAC — динамические права¶
Роли и права хранятся в БД и меняются во время работы. Полный каталог — на странице Карта возможностей.
| Метод | Путь | Право |
|---|---|---|
GET |
/api/v1/rbac/me |
вход выполнен — собственные права |
GET |
/api/v1/rbac/roles · /permissions |
roles.manage |
POST PUT DELETE |
/api/v1/rbac/roles… |
roles.manage |
PUT |
/api/v1/rbac/roles/{id}/permissions |
roles.manage |
Проверка прав выполняется middleware на уровне маршрута
(RequirePermission), а не повторяется в каждом обработчике, поэтому новый
эндпоинт гораздо реже уезжает в продакшн без защиты. Матрицу фиксирует тест
routes_authz_matrix_test.go.
UI: /admin/roles.
Поверхность администратора¶
| Метод | Путь | Право |
|---|---|---|
GET POST |
/api/v1/admin/users |
users.manage |
PUT |
/api/v1/admin/users/{id}/role · /active |
users.manage |
DELETE |
/api/v1/admin/users/{id} |
users.manage |
GET PUT |
/api/v1/admin/ai/prompts · /{key} |
settings.manage |
POST |
/api/v1/admin/ai/knowledge/reindex |
settings.manage |
Слои промптов AI и база знаний настраиваются из БД — см. AI-конвейер. Слой ограничений (guardrails) зашит в код и никогда не настраивается.
UI: /admin/dashboard, /admin/users, /admin/settings, /admin/core.
Суперадмин¶
| Метод | Путь | Что |
|---|---|---|
GET POST |
/api/v1/superadmin/admins |
Список / добавление админов |
GET POST |
/api/v1/superadmin/admins/by-register |
Поиск / добавление по регистрационному номеру |
PUT |
/api/v1/superadmin/admins/{id}/grant |
Выдать права |
DELETE |
/api/v1/superadmin/admins/{id} |
Отозвать права |
GET POST DELETE |
/api/v1/superadmin/invites… |
Управление приглашениями |
GET PUT |
/api/v1/superadmin/access-mode |
Режим доступа платформы (public / private) |
Онбординг и MFA¶
Путь к роли суперадмина защищён несколькими слоями:
- Список приглашений — онбординг не может начаться с неприглашённого адреса, а использованное приглашение больше не работает.
- Подтверждение eID —
POST /api/v1/auth/superadmin/onboard/eid/start·/start-id·/poll(по РНН или QR). - Google или email —
/onboard/google,/onboard/email/send·/verify. - TOTP MFA —
/onboard/totp/init·/verify, затем при каждом входеPOST /api/v1/auth/superadmin/mfa.
Секрет TOTP хранится как шифротекст AES-GCM — открытый текст в БД не попадает никогда. Коды восстановления показываются один раз при создании; в БД хранится только их хеш SHA-256, а использованный код больше не сработает.
Все эндпоинты онбординга закрыты ограничителем auth (5/мин).
UI: /superadmin/login, /superadmin/onboard, /admin/superadmin.
Аудит¶
Журнал аудита связан хеш-цепочкой и работает только на добавление. Каждая запись несёт хеш предыдущей, поэтому изменение или удаление строки в середине рвёт цепочку.
| Метод | Путь | Что |
|---|---|---|
GET |
/api/v1/audit |
Постраничный список (admin) |
GET |
/api/v1/audit/verify |
Проверка целостности цепочки |
verify возвращает { ok, broken_id } — при ok=false указывает id первой
повреждённой строки.
Действующее лицо читается из RLS-идентичности запроса, а request_id — из
контекста автоматически; вызывающая сторона их не передаёт, что оставляет мало
места для подделки авторства.
Микросекундная точность
timestamptz в Postgres имеет микросекундную точность. Если время,
попадающее в хеш, не усечено соответствующим образом, VerifyChain даёт
ложные срабатывания из-за наносекундного расхождения — код учитывает это
намеренно.
UI: /admin/audit.
События безопасности¶
Собираются клиентские сигналы безопасности (нарушения CSP и подобные):
POST /api/v1/security/events— открыт любому вошедшему пользователю (RLS фиксируетuser_id)GET /api/v1/security/events— только admin
UI: /admin/security.
Оформление и бренд¶
Цвета, шрифты и плотность не зашиваются в код — они настраиваются из админки.
| Метод | Путь | Право |
|---|---|---|
GET |
/api/v1/site/appearance |
открыто (нужно публичной странице) |
PUT |
/api/v1/site/appearance |
settings.manage |
GET |
/api/v1/themes/active |
открыто |
GET POST PUT DELETE |
/api/v1/themes… |
admin |
PUT |
/api/v1/themes/{id}/active |
admin |
У каждого пользователя может быть собственное переопределение. UI:
/admin/themes, /admin/settings.