> ## Documentation Index
> Fetch the complete documentation index at: https://faq.exode.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Права доступа

> Как устроен RBAC в онлайн-школе: полный список прав, экран запрета доступа и настройка прав команды

Доступ к разделам панели управления в онлайн-школе регулируется системой **RBAC**
(Role-Based Access Control — управление доступом на основе ролей). Вместо жёстких ролей платформа
оперирует **правами (permissions)** — маленькими разрешениями вроде «управлять курсами» или
«просматривать баланс». Роль сотрудника — это просто набор выданных ему прав.

## Как работает RBAC

При каждом заходе на защищённую страницу система сравнивает **запрошенные** правом страницы разрешения
с **выданными** пользователю. Выданные права складываются из двух источников — прав самого пользователя
и прав его роли в организации (`combinedPermissions`):

```typescript theme={null}
get combinedPermissions(): Permission[] {
    return [ ...SellerStore.permissions, ...UserAuthStore.permissions ];
}
```

Проверка проходит по принципу «достаточно любого из требуемых прав» (`canAny`): если у пользователя есть
хотя бы одно из перечисленных для страницы прав — доступ открыт.

```typescript theme={null}
static canAny(granted, ...required) {
    if (!required?.length) {
        return true;
    }

    return required.some((permission) => (
        _.isArray(permission)
            ? this.canEvery(granted, permission)
            : granted.includes(permission)
    ));
}
```

<Note>
  Если право задано вложенным массивом (`canEvery`), то для доступа нужны **все** права из этого массива.
  Так реализуются комбинированные условия. Обычно же в требованиях страницы перечислены альтернативы —
  хватает любого одного права.
</Note>

### Защита на уровне маршрутов

Каждый защищённый маршрут в конфигурации роутера объявляет поле `auth` со списком нужных прав. Например,
раздел управления курсами доступен обладателям любого из трёх прав:

```javascript theme={null}
'/manage/courses/:page([0-9]+)': {
    view: <ManageCoursesListPage/>,
    auth: [
        Permission.CourseManage,
        Permission.CourseView,
        Permission.ProductManage,
    ],
}
```

Обёртка `Middleware.Auth` проверяет права перед показом страницы: авторизованному пользователю без нужного
права показывается экран запрета, а неавторизованного перенаправляет на страницу входа.

### Защита отдельных элементов интерфейса

Отдельные кнопки и блоки внутри страницы тоже можно скрывать по правам с помощью компонента
`Rbac.Permission` — например, кнопки удаления менеджера видны только тем, у кого есть право `SellerManage`:

```javascript theme={null}
<Rbac.Permission permissions={[ Permission.SellerManage ]}>
    <DeleteManagerItem/>
</Rbac.Permission>
```

## Полный список прав

Права сгруппированы по модулям. Ниже — все права из перечисления `Permission`, сгруппированные так же,
как они отображаются в интерфейсе (`byModule`).

### Управление школой (School)

| Право                  | Что даёт                           |
| ---------------------- | ---------------------------------- |
| `SchoolManageSettings` | Изменение настроек школы           |
| `SchoolManageUsers`    | Управление пользователями школы    |
| `SchoolManagePages`    | Управление страницами школы        |
| `SchoolCustomizeSite`  | Редактирование дизайна сайта школы |

### Управление организацией (Seller)

| Право                  | Что даёт                                |
| ---------------------- | --------------------------------------- |
| `SellerManage`         | Просмотр и изменение данных организации |
| `SellerSales`          | Просмотр истории платежей и отчётов     |
| `SellerFinances`       | Просмотр баланса и выплат               |
| `SellerRefunds`        | Управление возвратами                   |
| `SellerManageManagers` | Управление другими сотрудниками команды |

### Управление курсами (Course)

| Право                  | Что даёт                                         |
| ---------------------- | ------------------------------------------------ |
| `CourseManage`         | Управление курсами (структура, уроки, материалы) |
| `CourseView`           | Просмотр списка курсов                           |
| `CourseCurator`        | Проверка домашних заданий                        |
| `CourseReportingView`  | Просмотр отчётов по курсам                       |
| `CourseCommentsManage` | Управление комментариями в курсах                |
| `CourseStudentManage`  | Просмотр информации об учениках                  |

### Управление продуктами (Product)

| Право           | Что даёт                                            |
| --------------- | --------------------------------------------------- |
| `ProductManage` | Управление запусками, ценами, купонами, публикацией |

### Управление заданиями и практикой (Task)

| Право        | Что даёт                     |
| ------------ | ---------------------------- |
| `TaskView`   | Просмотр базы заданий        |
| `TaskManage` | Создание и изменение заданий |

### Управление персоналом (Staff)

<Note>
  Модуль «Персонал» отображается только на корпоративных площадках (`IS_CORPORATE`). В обычной онлайн-школе
  эти права не показываются.
</Note>

| Право         | Что даёт              |
| ------------- | --------------------- |
| `StaffManage` | Управление персоналом |
| `StaffView`   | Просмотр персонала    |

<Note>
  Помимо перечисленных, в перечислении `Permission` есть служебные и платформенные права
  (`UserIsAdmin`, `AdminSellerVerify`, `AdminCoursePublish`, `TournamentCreateOfficial` и др.).
  Они относятся к администрированию всей платформы-маркетплейса и не настраиваются в панели отдельной школы.
</Note>

## Экран запрета доступа

Если сотрудник открывает раздел, на который у него нет прав, вместо страницы показывается **экран запрета**
(`Rbac/Forbidden`). Он объясняет, что доступ ограничен, и перечисляет, какие права требуются.

<img src="https://mintlify.s3.us-west-1.amazonaws.com/exode-faq/images/online-schools/roles-permissions/forbidden.png" alt="Экран запрета доступа с перечнем требуемых прав" />

На экране отображается:

* значок замка и заголовок «Недостаточно прав»;
* пояснение об условиях получения доступа;
* список требуемых прав в виде чипов (`required`);
* кнопка «Обновить страницу» — на случай, если права были только что выданы и нужно перечитать сессию.

<Tip>
  Если вы только что выдали сотруднику право, а он всё ещё видит экран запрета — попросите его нажать
  «Обновить страницу» или перезайти. Права подтягиваются в сессию при загрузке.
</Tip>

## Настройка прав команды

Права выдаются при добавлении сотрудника и в любой момент могут быть изменены.

### Добавление менеджера

<Steps>
  <Step title="Откройте раздел менеджеров">
    Перейдите в «Мои менеджеры» (`/manage/school/managers`) для сотрудников с доступом ко всей школе
    или в «Менеджеры продукта» (`/manage/school/product-managers`) для доступа к одному курсу.
  </Step>

  <Step title="Найдите пользователя">
    Через поиск по пользователям выберите человека, которого добавляете в команду. Для менеджера продукта
    дополнительно выберите курс. Если пользователь уже является менеджером, система предупредит об этом и
    предложит перейти к редактированию.
  </Step>

  <Step title="Отметьте права">
    В блоке «Выберите права пользователя» права сгруппированы по модулям (Школа, Организация, Курсы и т.д.).
    Отметьте галочками нужные разрешения. У каждого права есть название и краткое описание.
  </Step>

  <Step title="Сохраните">
    Нажмите «Добавить менеджера». Сотрудник получит выбранный набор прав.
  </Step>
</Steps>

<img src="https://mintlify.s3.us-west-1.amazonaws.com/exode-faq/images/online-schools/roles-permissions/manager-add.png" alt="Форма добавления менеджера с чекбоксами прав по модулям" />

### Изменение прав существующего сотрудника

Откройте карточку менеджера (`/manage/school/managers/:page/:managerId/permissions`) — на странице
«Настройки менеджера» можно изменить набор прав, временно **деактивировать** сотрудника
(переключатель активности) или **удалить** его из команды. Действия деактивации и удаления доступны
только тем, у кого есть право `SellerManage`, и недоступны для самого себя.

### Пользователи школы

Учеников и их доступы к курсам вы заводите в отдельном разделе «Пользователи школы»
(`/manage/school/users`). Здесь создаются учётные записи учеников, отправляются приглашения и
выдаются доступы к курсам — это работа с учащимися, а не с правами сотрудников команды.

<Note>
  Раздел «Пользователи школы» управляет **учениками и их доступами к курсам**, а раздел «Мои менеджеры» —
  **правами сотрудников** на управление школой. Не путайте: выдача ученику доступа к курсу не даёт ему
  никаких управленческих прав.
</Note>

### Права сотрудников платформы (админ-раздел)

Для площадок-маркетплейсов существует отдельный административный раздел `/admin/users`, где супер-администратор
(право `UserIsAdmin`) назначает пользователям платформенные права из полного списка (`userManage`).
Этот раздел управляет доступом на уровне всей площадки и к настройкам отдельной школы не относится.
