Привілеї
Рольова модель адмінського доступу. Працює однаково на обох дата-провайдерах: json зберігає помічників з їхніми привілеями так само, як sql.
Дві ролі
Супер-адмін — облікові дані з ADMIN_LOGIN і ADMIN_PASS у server/.env. Проходить будь-яку перевірку привілеїв незалежно від списку.
Помічники — створюються супер-адміном, спершу неавторизовані, активують себе тимчасовим паролем. Мають лише явно видані привілеї. Зміни застосовуються без повторного входу.
Як перевіряються
У HTTP-роутах привілей стоїть мідлваром одразу після автентифікації:
router.post('/switch-mode',
requireAdmin,
requirePrivilege(PRIVILEGES.MODE_SWITCH),
handler);Частина перевірок живе на рівні Socket.io (socket/context.js) — саме так працюють RADIO_HOST і RADIO_MODERATOR, тому в таблиці нижче в них нуль HTTP-ендпоінтів.
Усього привілеїв: 14
| Привілей | Значення | Захищає ендпоінтів |
|---|---|---|
QUEUE_MANAGE | queue_manage | 1 |
ARTIST_ARTS | artist_arts | 4 |
UPLOAD_SONGS | upload_songs | 10 |
EDITOR_LYRICS | editor_lyrics | 9 |
EDITOR_META | editor_meta | 14 |
SETTINGS_BRANDING | settings_branding | 0 |
SETTINGS_GROUPS | settings_groups | 4 |
SETTINGS_ALGORITHM | settings_algorithm | 0 |
STATS | stats | 2 |
MODE_SWITCH | mode_switch | 1 |
JINGLES_UPLOADER | jingles_uploader | 21 |
RADIO_HOST | radio_host | 0 |
RADIO_MODERATOR | radio_moderator | 0 |
DONATIONS_MANAGE | donations_manage | 3 |
Таблиця рахує лише HTTP-ендпоінти. Частина привілеїв — насамперед
RADIO_HOSTіRADIO_MODERATOR— перевіряється ще й на рівні Socket.io (socket/context.js), тож нуль у колонці не означає, що привілей не діє.
Посекційна перевірка на POST /api/admin/settings
Один ендпоінт записує три групи налаштувань, які керуються різними привілеями:
| Секція тіла запиту | Привілей | Що містить |
|---|---|---|
branding | SETTINGS_BRANDING | назви радіо, посилання |
generation | SETTINGS_ALGORITHM | тривалості, режим, групи жанрів |
radioHosts | RADIO_MODERATOR | ліміти гостей і спецгостей |
Авторизація йде за тим, що реально змінюється, а не за тим, що надіслано. Причина в тому, що адмінка завжди шле всі секції одразу, навіть ті, які поточний адмін не редагував — тож сама присутність секції нічого не означає.
Сервер прогонить вхідні дані й поточний стан через один і той самий конвеєр валідації та порівнює результат: якщо секція після нормалізації збігається, привілей на неї не потрібен. Це означає, що перетворення одиниць, обрізання пробілів чи інший порядок ключів ніколи не виглядають як правка.
Якщо змінюється секція, на яку немає прав, запит відхиляється з 403 цілком — частково зберегти не вийде. Секції, що змінилися, пишуться в журнал аудиту.
Для авторів власної адмінки
songGroups у цьому запиті ігнорується: групи пісень редагуються окремими ендпоінтами /api/admin/song-groups під привілеєм SETTINGS_GROUPS.