Матрица прав текущего фронта
Матрица прав текущего фронта
Назначение
Документ связывает текущие экраны frontend-ksailab с capability catalog и показывает, где сейчас фронт уже задаёт реальную поверхность доступа, а где экран пока является UI-шаблоном.
Источники
Матрица составлена по текущему фронту:
app/layouts/default.vue— основная навигация;app/composables/useAuth.ts— текущая frontend auth-модель;app/middleware/auth.global.ts— route guard;app/pages/login.vue— текущая страница логина;app/pages/auth/callback.vue— post-session bootstrap page;app/pages/**— текущий набор экранов.
Связанные репозитории:
frontend-ksailabbackend-ksailabdocs-ksailab
Текущий auth-статус фронта
На сегодня frontend находится в переходном состоянии:
authRepository.tsуже bootstrap-ится черезGET /api/v1/auth/me;app/pages/auth/callback.vueуже ведёт себя как frontend post-session page и не владеет code exchange;- HTTP client уже использует cookie/session semantics (
credentials: 'include'); - runtime defaults для login/logout уже выровнены на backend entrypoints;
- middleware всё ещё требует финальной cleanup-синхронизации, чтобы public auth routes не bootstrap-ились слишком рано;
- права на экраны уже должны идти от backend capability set, но не весь UI ещё доведён до capability-driven поведения;
logged-outостаётся отдельным переходным UX-состоянием, потому что full platform logout ещё не завершён во всех companion repos.
Одновременно backend уже changed underneath:
- canonical bootstrap endpoint теперь
GET /api/v1/auth/me; - отдельного
/capabilitiesendpoint в этой фазе нет; - local
POST /api/v1/auth/loginиPOST /api/v1/auth/refreshбольше не рабочий auth flow и возвращают410 Gone; - onboarding orchestration уже существует в
POST /api/v1/onboarding/*.
Это означает: матрица ниже описывает целевую permission-модель, но должна учитывать уже landed backend contract.
Canonical browser auth contract for frontend
Для frontend canonical human/browser auth contract выглядит так:
- frontend отправляет browser на
GET /api/v1/auth/login; - backend уводит browser в Keycloak;
- Keycloak возвращает browser на
GET /api/v1/auth/callback; - backend создаёт server-side auth session и возвращает browser cookie;
- backend редиректит browser обратно на frontend route;
- frontend вызывает
GET /api/v1/auth/me.
Для target next wave шаг 4 означает:
- browser cookie содержит только opaque session key;
- auth session и tokens живут server-side;
/auth/meчитает backend session storage, а не frontend token state.
Из этого следуют жёсткие правила:
- frontend не владеет canonical code exchange;
- frontend не должен считать direct frontend-to-Keycloak login рекомендуемым default path;
- существование Keycloak client
ksailab-frontendне делает frontend владельцем browser auth flow; - frontend ownership начинается с bootstrap UI state, menu gating и route/component guards после
/auth/me.
Что backend уже даёт фронту
Auth bootstrap
GET /api/v1/auth/me уже возвращает:
principal;classification;realm_roles;bundles;effective_capabilities.
Текущий runtime capability baseline
Для первой auth/onboarding волны backend уже отдаёт:
auth.bootstrap.readonboarding.teacher.createonboarding.group.createonboarding.group.assign_teacheronboarding.student.bulk_createonboarding.credentials.consume
Текущий onboarding API
Backend уже экспонирует:
POST /api/v1/onboarding/teachersPOST /api/v1/onboarding/groupsPOST /api/v1/onboarding/groups/{group_id}/teachersPOST /api/v1/onboarding/groups/{group_id}/students/bulkPOST /api/v1/onboarding/credentials/consume
Важно: временный пароль больше не должен ожидаться inline в create-ответах. Во фронте нужно проектировать one-time receipt handoff.
Permissions read layer
Для admin-facing Permissions section backend теперь отдельно экспонирует:
GET /api/v1/permissions/catalogGET /api/v1/permissions/role-mappingsGET /api/v1/permissions/bundles
Это read-only metadata layer для roles/bundles/catalog UX. Он не заменяет GET /api/v1/auth/me как bootstrap current principal.
Матрица экранов
| Экран / раздел | Route | Capability | Starter bundles | Роли по умолчанию | Backend ABAC | Статус текущего UI |
|---|---|---|---|---|---|---|
| Главная | / | home.read | admin.base, teacher.base, student.base | admin, teacher, student | Нет | Реальный экран |
| Входящие | /inbox | inbox.read | admin.base, teacher.base, student.base | admin, teacher, student | Нет | UI-оболочка |
| Профиль | /profile | profile.read | admin.base, teacher.base, student.base | admin, teacher, student | Self only | Реальный экран |
| Настройки | /settings | settings.read | admin.base, teacher.base, student.base | admin, teacher, student | Self only | Реальный экран |
| Безопасность | /settings/security | settings.security.read / settings.security.manage | admin.base, teacher.base, student.base | admin, teacher, student | Self only | Реальный self-service shell: экран открывает backend-owned account security entrypoint GET /api/v1/auth/account/security и не держит локальную password form |
| Уведомления | /settings/notifications | settings.notifications.read / settings.notifications.manage | admin.base, teacher.base, student.base | admin, teacher, student | Self only | Реальный экран |
| Модули | /modules | modules.read | admin.base, teacher.base, student.base | admin, teacher, student | Нет | UI-обзор |
| Система | /system | system.read | admin.base | admin | Нет | UI-обзор, интеграционный экран |
| Учебные курсы | /education/courses | education.courses.read / education.courses.manage | admin.base, teacher.base, student.base | admin, teacher, student(read) | Да | Реальный экран, требует дальнейшего ABAC |
| Учебные группы | /education/groups | education.groups.read / education.groups.manage / education.groups.members.manage | admin.base, teacher.base, student.base | admin, teacher, student(read) | Да | Реальный экран, должен стать точкой group creation, teacher assignment и student onboarding |
| Библиотека | /education/library | education.library.read | admin.base, teacher.base, student.base | admin, teacher, student | Да | Реальный экран |
| Банк вопросов | /education/question-bank | education.question_bank.read / education.question_bank.manage | admin.base, teacher.base | admin, teacher | Да | Реальный экран |
| Логирование | /monitoring/logging | monitoring.logs.read | admin.monitoring | admin | Нет | Сейчас считать admin-only |
| Системная информация | /monitoring/system-info | monitoring.system_info.read | admin.monitoring | admin | Нет | Сейчас считать admin-only |
| БД диагностика | /monitoring/db-diagnostics | monitoring.db_diagnostics.read | admin.monitoring | admin | Нет | Сейчас считать admin-only |
| K8S диагностика | /monitoring/k8s-diagnostics | monitoring.k8s_diagnostics.read | admin.monitoring | admin | Нет | Сейчас считать admin-only |
| Разрешения -> Пользователи | /permissions/users | permissions.users.read / permissions.users.manage / permissions.users.credentials.manage | admin.permissions | admin | Нет | Реальный admin screen: teacher provisioning через onboarding contract, one-time credential handoff, live backend user directory. Follow-up password changes уходят в personal security flow; assignments / overrides и admin credential lifecycle ещё ждут backend contract |
| Разрешения -> Группы | /permissions/groups | permissions.groups.read / permissions.groups.manage | admin.permissions | admin | Нет | Честный backend-backed shell: starter bundle catalog и capability composition теперь приходят через GET /api/v1/permissions/bundles и GET /api/v1/permissions/catalog. Group assignments ещё остаются follow-up контрактом |
| Разрешения -> Роли | /permissions/roles, /permissions/roles/new, /permissions/roles/:roleKey | permissions.roles.read / permissions.roles.manage | admin.permissions | admin | Нет | Реальный list/detail/create-shell без липового CRUD. Экран читает GET /api/v1/permissions/role-mappings, GET /api/v1/permissions/bundles и GET /api/v1/permissions/catalog, показывая runtime baseline отдельно от target starter model |
Важные ограничения текущего фронта
1. Login shell уже частично Keycloak-first, но ещё не полностью выровнен
Сейчас frontend уже живёт рядом с backend-owned session contract, но в runtime defaults ещё может оставаться wrong path:
- login не должен по умолчанию стартовать direct frontend -> Keycloak;
- canonical path должен идти через backend
/api/v1/auth/login; - logout не должен миновать backend
/api/v1/auth/logout; - продуктовая кнопка
Выйтине должна документироваться как local-only cleanup.
2. Route guards уже partially capability-driven
Текущий middleware уже использует backend bootstrap context и часть capability-based route resolution, но переход ещё не завершён:
- public auth routes требуют финальной ordering-синхронизации;
- не весь UI одинаково строго опирается на capability manifest;
- contract всё ещё нельзя считать полностью стабилизированным, пока frontend issue по auth alignment не закрыт.
3. Permissions section частично уже живёт на реальном API
Секция permissions/* больше не должна трактоваться как набор скрытых моков, но и не вся административная модель уже раскрыта backend.
Текущее состояние такое:
permissions/usersуже работает поверх onboarding contract и backend user directory: teacher accounts, one-time credential handoff и базовые activate/delete lifecycle actions читаются как реальный runtime flow, а follow-up password changes делегированы в personal security flow;permissions/groupsбольше не использует локальные массивы и fake CRUD: starter bundle catalog и capability composition уже читаются из backend read layer, но group assignments ещё ждут отдельный contract;permissions/rolesбольше не использует моковые строки и локальный CRUD: starter role mappings и runtime baseline теперь читаются из backend read layer, но write-orchestration остаётся follow-up треком.
Дополнительно:
education/groupsдолжен стать точкой bulk onboarding студентов и membership management;teacher-sideuser creation сценарии из старого фронта не переносятся в v1 как разрешённый flow;- create flows не должны ожидать обычное поле
temporary_passwordв response body.
4. Settings -> Security теперь backend-owned
/settings/security больше не должен документироваться как локальная password form внутри Nuxt.
Текущий фронт использует этот экран как self-service shell:
- canonical entrypoint для пользователя —
GET /api/v1/auth/account/security; - frontend не должен вызывать
/users/password/*как рабочий UX; - delete-account и admin reset-password action нельзя показывать как живые, пока backend не отдаст отдельный lifecycle contract.
5. Monitoring и System требуют жёсткой явной политики
Даже если экран существует в меню, доступ к нему нельзя определять только по наличию route. Для этих разделов capability-подход обязателен с самого начала.
Что должен делать frontend после миграции
- Стартовать browser login через backend
/api/v1/auth/login, а не через direct Keycloak URL как default contract. - Инициализироваться через
GET /api/v1/auth/me. - Открывать self-service security только через
GET /api/v1/auth/account/security, а не через legacy/users/password/*endpoints. - Строить меню на основе capabilities.
- Применять route/component guards на основе capabilities.
- Не полагаться на роль как на единственный механизм доступа.
- Не считать скрытие элемента окончательной защитой, потому что backend всегда валидирует доступ повторно.
Отдельный /capabilities endpoint во frontend integration этой фазы закладывать не нужно: bootstrap идёт только через GET /api/v1/auth/me.
При этом Permissions section может и должен читать отдельный read-only admin layer GET /api/v1/permissions/catalog, GET /api/v1/permissions/role-mappings и GET /api/v1/permissions/bundles.
ksailab-frontend можно трактовать только как transition client contract в Keycloak, если runtime пока ещё требует его для совместимости. Это не меняет ownership canonical browser flow.
Как frontend участвует в быстром rollout фич
Frontend не должен ждать отдельной переработки role guards под каждую новую функцию.
Целевая схема:
- новый экран получает capability key;
- capability добавляется в bundle через admin UI;
GET /api/v1/auth/meвозвращает обновлённый effective capability set;- меню и экран автоматически открываются нужной аудитории.
Для onboarding-сценариев это раскладывается так:
permissions/usersоткрывает admin-only teacher provisioning;education/groupsоткрывает admin-only group and roster actions;- student onboarding не требует отдельного меню, а живёт внутри group workflow;
- receipt consume flow показывает временный пароль только в одноразовом handoff UI.
Связанная operating model:
Что считать готовностью frontend permission-модели
Frontend считается согласованным с архитектурой, когда:
- browser login стартует через backend entrypoint, а не через direct frontend-owned Keycloak flow;
- browser logout различает local app cleanup и full platform logout;
- каждый экран связан с capability key;
- меню и CTA рендерятся по capabilities;
- административные экраны не открываются по одному только факту логина;
GET /api/v1/auth/meполностью хватает для initial render и guards;- create/onboarding формы корректно работают с receipt-based credential handoff;
- новые экраны добавляются через каталог capabilities, а не через набор ad-hoc условий.