06 Authorization

Каталог capabilities

Каталог capabilities

Назначение

Каталог capabilities задаёт единый словарь платформенных прав для:

  • пунктов меню;
  • маршрутов и страниц;
  • component-level visibility;
  • action buttons и административных операций;
  • серверного permission bootstrap через backend-owned GET /api/v1/auth/me.

Важно: capabilities не заменяют ABAC. Они отвечают за глобальную видимость и право инициировать действие. Доступ к конкретному ресурсу backend проверяет дополнительно. Важно отдельно: capability catalog не описывает ownership OIDC clients, code exchange или browser session lifecycle. Это другой слой auth-контракта.

Где каталог живёт

Capability catalog является версионируемым контрактом.

Он должен существовать синхронно:

  • в backend как capability registry;
  • в документации как canonical human-readable реестр.

Platform UI использует этот каталог, но не создаёт новые capability keys самостоятельно. Keycloak также не должен использоваться как primary store этого каталога.

Текущая backend read-only delivery surface для этого каталога:

  • GET /api/v1/permissions/catalog — capability registry snapshot;
  • GET /api/v1/permissions/role-mappings — starter role mappings;
  • GET /api/v1/permissions/bundles — starter bundle composition.

Это admin read layer для Permissions section, а не замена bootstrap-контракту GET /api/v1/auth/me.

Принципы именования

  • формат: <section>.<resource>.<action>;
  • ключ должен быть стабильным и человекочитаемым;
  • capability должен описывать платформенное право, а не внутреннюю техническую реализацию.

Базовый каталог

CapabilityНазначениеТипРоли по умолчаниюStarter bundlesКомментарий
home.readДоступ к главной страницеGlobaladmin, teacher, studentadmin.base, teacher.base, student.baseБазовый вход в платформу
inbox.readДоступ к входящим уведомлениямGlobaladmin, teacher, studentadmin.base, teacher.base, student.baseПока UI-оболочка
profile.readПросмотр собственного профиляGlobal + selfadmin, teacher, studentadmin.base, teacher.base, student.baseТолько для себя
settings.readДоступ к общим настройкамGlobal + selfadmin, teacher, studentadmin.base, teacher.base, student.baseБазовый settings shell
settings.security.readПросмотр раздела безопасностиGlobal + selfadmin, teacher, studentadmin.base, teacher.base, student.baseПерсональный security section
settings.security.manageИзменение настроек безопасностиSelfadmin, teacher, studentadmin.base, teacher.base, student.baseПерсональный security action scope
settings.notifications.readПросмотр настроек уведомленийGlobal + selfadmin, teacher, studentadmin.base, teacher.base, student.baseПерсональный notifications section
settings.notifications.manageИзменение настроек уведомленийSelfadmin, teacher, studentadmin.base, teacher.base, student.baseПерсональные настройки
modules.readДоступ к разделу модулейGlobaladmin, teacher, studentadmin.base, teacher.base, student.baseТекущий экран обзорный
system.readДоступ к разделу системы и интеграцийGlobaladminadmin.baseСейчас следует считать admin-only
education.readДоступ к разделу образованияGlobaladmin, teacher, studentadmin.base, teacher.base, student.baseРодительский раздел
education.courses.readПросмотр учебных курсовGlobaladmin, teacher, studentadmin.base, teacher.base, student.baseДля teacher/student дальше включается ABAC
education.courses.manageСоздание и изменение учебных курсовGlobal + resourceadmin, teacheradmin.base, teacher.baseTeacher только для своих сущностей
education.groups.readПросмотр учебных группGlobaladmin, teacher, studentadmin.base, teacher.base, student.baseДля student фактически через assignment scope
education.groups.manageСоздание и изменение учебных группGlobal + resourceadmin, teacheradmin.base, teacher.baseTeacher только в своём контуре после v1 onboarding
education.groups.members.readПросмотр состава группыGlobal + resourceadmin, teacheradmin.base, teacher.baseИспользуется для roster и membership UI
education.groups.members.manageНазначение teacher и onboarding студентов в группуGlobal + resourceadminadmin.baseВ первой версии bulk student onboarding и teacher assignment выполняет только admin
education.library.readПросмотр библиотеки материаловGlobal + resourceadmin, teacher, studentadmin.base, teacher.base, student.baseДоступ к конкретным материалам проверяется отдельно
education.question_bank.readПросмотр банка вопросовGlobal + resourceadmin, teacheradmin.base, teacher.baseМожет быть расширено позже
education.question_bank.manageУправление банком вопросовGlobal + resourceadmin, teacheradmin.base, teacher.baseTeacher только по allowed scope
monitoring.readДоступ к разделу мониторингаGlobaladminadmin.monitoringРодительский раздел
monitoring.logs.readПросмотр логов и аудитных событийGlobaladminadmin.monitoringОбычно admin/support
monitoring.system_info.readПросмотр системной информацииGlobaladminadmin.monitoringОбычно admin/support
monitoring.db_diagnostics.readПросмотр диагностики БДGlobaladminadmin.monitoringОбычно admin/platform engineer
monitoring.k8s_diagnostics.readПросмотр K8s-диагностикиGlobaladminadmin.monitoringОбычно admin/platform engineer
permissions.readДоступ к разделу управления доступамиGlobaladminadmin.permissionsРодительский раздел
permissions.users.readПросмотр пользователей и их ролейGlobaladminadmin.permissionsДля admin UI и аудита
permissions.users.manageСоздание и изменение teacher/admin accountsGlobaladminadmin.permissionsДелегируется в Keycloak Admin API
permissions.users.credentials.manageСброс стартового пароля и credential lifecycleGlobaladminadmin.permissionsВключает повторную выдачу временного пароля и re-arm первого входа
permissions.groups.readПросмотр permission-групп и bundlesGlobaladminadmin.permissionsБазовый список bundles и assignments
permissions.groups.manageУправление permission-группами и bundlesGlobaladminadmin.permissionsОсновная ежедневная админка bundles
permissions.roles.readПросмотр platform role mappingsGlobaladminadmin.permissionsНе равно realm role editing напрямую
permissions.roles.manageУправление role mappings и grantsGlobaladminadmin.permissionsДелегируется через backend orchestration

Runtime-only baseline рядом с каталогом

Текущий backend registry уже хранит и отдельный landed runtime baseline первой auth/onboarding wave:

  • auth.bootstrap.read
  • onboarding.teacher.create
  • onboarding.group.create
  • onboarding.group.assign_teacher
  • onboarding.student.bulk_create
  • onboarding.credentials.consume

В read-only backend contract эти keys могут публиковаться рядом с базовым catalog snapshot как runtime_baseline, но это не означает, что starter bundles уже переведены на полный DB-driven permission admin model.

Что делать с новыми фичами

Для любой новой фичи порядок должен быть таким:

  1. Добавить capability в каталог.
  2. Зафиксировать, это global capability или resource-scoped действие.
  3. Обновить матрицу прав фронта.
  4. Добавить backend policy rule.
  5. Добавить capability в /auth/me, если фича доступна роли или группе пользователей.

Именно эта последовательность даёт возможность расширять систему доступа за полчаса, а не переписывать логику вручную по всему стеку.

Для onboarding первой версии это означает:

  • teacher account lifecycle опирается на permissions.users.*;
  • group roster и student onboarding опираются на education.groups.members.*;
  • сам факт существования teacher или student realm role не считается достаточным без соответствующих platform capabilities.
  • frontend не должен делать вывод о доступе только по наличию client-side JWT claims без backend bootstrap через /auth/me.

Lifecycle capability

Добавление

Новая capability добавляется только через:

  1. backend registry;
  2. этот каталог;
  3. backend policy usage;
  4. frontend matrix при необходимости.

Администрирование после релиза

После появления capability в каталоге platform admin может без релиза:

  • добавить её в существующий bundle;
  • создать новый bundle;
  • выдать bundle пользователю или группе;
  • наложить allow/deny override.

Удаление

Capability сначала помечается как deprecated, затем выводится из bundles и только после очистки использования удаляется окончательно.

Подробная operating model:

Что не делать

  • Не кодировать доступ только через role === ....
  • Не заводить ad-hoc поля вида canSeeMonitoring, если им можно дать нормальный capability key.
  • Не смешивать глобальную видимость страницы и доступ к конкретному ресурсу в одно право.
  • Не считать capability достаточным без backend ABAC-проверки.
  • Не пытаться хранить полный каталог capabilities в Keycloak.
  • Не трактовать capability catalog как описание browser login flow или client ownership в Keycloak.