Права доступа (RBAC)
Обновлено 28.10.2026
Доступ в ВИШ строится на ролях (RBAC): у каждого аккаунта одна роль, у роли — набор прав, а методы API требуют определённых прав. Ключ API и токен OAuth права только сужают и никогда не расширяют. Сверено со стендом d1 23 октября 2026 года.
Роли
Роль определяет, что человек может в приложении. Встроенные роли:
| Код | Роль | Коротко |
|---|---|---|
user | Пользователь | Без дополнительных прав; так начинает каждый |
teacher | Преподаватель | Заметки к занятиям; аккаунт связан с карточкой преподавателя |
moderator | Модератор | Правит расписание института |
manager | Менеджер | Менеджер учебной программы |
programHead | Руководитель программы | Руководитель образовательной программы |
analyst | Аналитик | Смотрит и выгружает сводную аналитику, ничего не меняет (пока только d1) |
sales, adsManager | Продажи, Менеджер рекламы | Места, партнёры и рекламные кампании (пока только d1) |
inspector | Инспектор | Видит всё, ничего не меняет (режим просмотра) |
developer, admin | Разработчик, Администратор | Все права |
team, product, colleague | Команда VISH, Продакт, Коллега | Все права, как у разработчика: сотрудники VISH, продакт-менеджеры и коллеги из партнёров. Новые права каталога получают сами; право, снятое администратором, не возвращается (пока только d1) |
changelog-publisher | Публикация «Что нового» | Роль бота, которым CI публикует «Что нового»; больше ничего не может |
Администраторы могут завести и свои роли. Роль аккаунта и его права — в ответе GET /auth/me (поля role и permissions).
Права
Право — строка вида область:объект:действие. Несколько, которые чаще всего нужны интеграциям:
| Право | Что разрешает |
|---|---|
schedule:note:create, schedule:note:update, schedule:note:delete | Заметки к занятиям |
schedule:lesson:create, schedule:lesson:update, schedule:lesson:delete | Правка расписания |
schedule:lesson:notify | Уведомить о занятии всех, у кого оно в расписании |
analytics:read | Аналитика: /usage/export/…, /reports/institute, загруженность. Открытия пишутся в журнал аудита |
analytics:export | Выгрузка аналитики файлом, например расписание в JSON через POST /exports (пока только d1) |
students:read | Списки студентов групп |
api:keys:self-issue | Выпустить API-ключ себе без заявки |
Полный список с описаниями отдаёт GET /rbac/permissions — для него нужно право rbac:roles:read. Какие права требует конкретный метод, сказано в его описании в OpenAPI (/documentation).
Кроме прав, аккаунт можно ограничить группами и институтами: тогда даже с правом на правку человек правит только расписание своих групп.
Как проверяется запрос
- Кто вы. Ключ из
X-Api-Key, иначе токен изAuthorization: Bearer. Нет ни того ни другого — открытые методы отвечают как всем, остальные — 401AUTH_REQUIRED. - Права роли. Читаются заново при каждом запросе: если роль сменили, это действует сразу, а не когда истечёт токен.
- Сужение. У ключа права — пересечение того, что отметили при выпуске, и того, что роль даёт сейчас. У токена OAuth прав роли нет вовсе: только чтение из короткого списка методов, которые называет его
scope. - Режим просмотра. Аккаунт в режиме просмотра (роль «Инспектор») может только читать: любой изменяющий запрос — 403
VIEW_ONLY, с ключом тоже. - Проверка метода. Нет нужного права — 403
FORBIDDEN, вerror.messageназваны недостающие права.
Что значит 403
error.code | Причина | Что делать |
|---|---|---|
FORBIDDEN | У роли или у ключа нет нужного права; оно названо в сообщении | Запросить роль с этим правом или выпустить ключ с ним |
VIEW_ONLY | Аккаунт в режиме просмотра | Изменения — с другого аккаунта |
SESSION_REQUIRED | Метод только для человека в приложении | Не вызывать ключом или токеном OAuth |
PERSON_REQUIRED | Метод только для людей, не для ботов | — |
OAUTH_SCOPE_INSUFFICIENT | Токену OAuth этот метод не разрешён | Только методы из списка для scope |
Опирайтесь на error.code: текст сообщения переводится и может меняться.
Как получить больше прав
- Роль. В приложении — «Моя роль» (
/role, или «Настройки» → «Доступ»): заявка на роль преподавателя или сотрудника. Её рассматривает сотрудник института; решение приходит уведомлением. - Ключ. Ключ не может больше, чем ваша роль. Если роль получила новые права, а ключ — нет, перевыпуск их не добавит (права и срок остаются прежними): нужен новый ключ — через заявку или выпуском себе, см. API и ключи доступа.
- Приложение «Входа через ВИШ». Запрашивайте только те
scope, что нужны; список разрешённых задаётся при регистрации.
Какие методы открыты
Открытый метод — тот, у которого в OpenAPI нет требования security. Пример считает такие методы по документу самого стенда:
// Count public and protected operations in the stand's own OpenAPI document.
const API = process.env.VISH_API ?? 'https://d1.vish-app.ru/api/v1'
const DOC = new URL('/documentation/json', API)
const response = await fetch(DOC)
if (!response.ok) throw new Error(`${DOC}: HTTP ${response.status}`)
const openapi = await response.json()
const operations = Object.entries(openapi.paths).flatMap(([path, methods]) =>
Object.entries(methods).map(([method, operation]) => ({
line: `${method.toUpperCase()} ${path}`,
isPublic: !operation.security?.length,
})),
)
const isPublic = (line) => operations.find((operation) => operation.line === line)?.isPublic
if (isPublic('GET /api/v1/groups') !== true || isPublic('GET /api/v1/auth/me') !== false) {
throw new Error('unexpected security in the OpenAPI document')
}
const open = operations.filter((operation) => operation.isPublic && operation.line.startsWith('GET '))
console.log(`${operations.length} operations, ${open.length} public GETs, for example:`)
for (const operation of open.slice(0, 8)) console.log(' ', operation.line)Свои роль и права можно посмотреть так (с ключом в поле «Ключ API»):
Попробовать запрос
Ключ нужен только методам с замком. Он живёт только на этой странице: не сохраняется, уходит лишь заголовком этого запроса и забывается, когда вы её покинете. Где взять ключ
Проверено: 2026-10, PWA aa337c45, platform bff65fce.