Роли и права
Как устроены права, маски, опасные права и права на отдельные поля
Право — это строка с точками: panel.users.read. Маска со звёздочкой выдаёт всё, что ниже неё, восклицательный знак снимает право. Кто настраивал права на игровом сервере, узнает логику сразу.
В панели права не набираются руками: Основное → Роли, карточка роли, блок «Права» — это список разделов с человеческими названиями и подсказками. Отметка у названия раздела включает весь раздел разом.
Из чего складываются права
Источников четыре, и все они попадают в один список:
- Роли. Обычный способ: у каждой есть имя, приоритет и набор прав.
- Личные права пользователя. Дописываются к ролевым.
- Донат. Купленные привилегии могут добавлять права ветки
player.. - Владелец. Этот признак перекрывает всё: у такого аккаунта есть каждое право в системе.
Синтаксис
panel.users.read конкретное право
panel.users.* все права раздела «Пользователи»
panel.* вся панель, кроме опасных прав
!panel.users.delete запрет, даже если разрешено маскойЗвёздочка раскрывается и в саму ветку: panel.users.* даёт и panel.users, и всё, что под ним. Запреты сильнее разрешений, где бы они ни стояли.
Маски правятся не в панели
Панель собирает права галочками, поля для маски в ней нет. Маски остаются в API, в сидах и в правах, которые уже выданы: роль admin из pnpm run seed держит panel.* и подхватывает новые права сама. В списке такое право стоит с подписью «Охвачено маской», и его можно снять галочкой — панель допишет запрет.
Приоритет ролей
Роли применяются по возрастанию приоритета: чем выше число, тем позже роль накладывается. Личные права идут последними, после всех ролей.
Ветки прав
| Префикс | Про что |
|---|---|
panel.* | Всё, что делается в панели: игроки, серверы, контент, магазин, донат, настройки |
player.* | Возможности игрока на сайте и в кабинете |
kernel.* | Служебные доступы для лаунчера и плагина |
mod.<id>.* | Права, которые объявил установленный модуль |
Роли admin (panel.*) и editor (разделы контента и коммерции) создаются командой pnpm run seed.
Обновление со старой схемы
До версии 1.7 ветки назывались admin., editor. и user.. При первом запуске новой версии права ролей, личные права и веб-права донат-привилегий переписываются на новую схему автоматически: маска раскрывается в точный список прав, которые она давала раньше, поэтому доступ ни у кого не расширяется.
Опасные права
Часть прав помечена в списке словом «Опасное»: выдача прав панели, назначение владельца, доступ к переменным и API-ключам, доступы RCON, команды товара, веб-права привилегий, правка ролей.
Маска такие права не выдаёт. panel.* даёт всю панель, но не даст поменять переменные сайта или сделать кого-то владельцем — их отмечают галочкой по одному. Так маска остаётся удобной, а случайно раздать лишнее ей не выйдет.
Что закрывает право на чтение
У разделов панели есть право …read. Оно всегда закрывает вход в раздел, а данные — только там, где эти данные не нужны сайту:
| Раздел | Данные закрыты правом |
|---|---|
| Пользователи, серверы (карточка), почта, вебхуки, языки, API-ключи, расширения, промо-коды, донат, магазин, моды, доходность | Да |
| Новости, статические страницы, список серверов | Нет: те же данные показывает сайт |
| Голосование, пополнение | Нет: бонусы показываются игроку в кабинете |
Во втором случае право закрывает раздел панели, но сам список можно прочитать через открытое API — он и так виден на сайте. Скрытые новости — исключение: их отдают только тем, у кого есть panel.news.hidden.
Список ролей видят все, кто заходит в панель (без него не назначить роль игроку), а вот права ролей приходят только тем, у кого есть panel.roles.read.
Права на серверы
Право, у которого есть смысл «на каком сервере», получает в списке значок сервера. Нажмите — выпадет список серверов проекта. По умолчанию отмечены все, снимите лишние — и право останется только на выбранных. Рядом с названием появится тег с сервером или счётчиком, а полный список видно по наведению.
Область считается у каждого права отдельно. Одна роль спокойно смешивает: доходность только по HiTech, донат по HiTech и SkyTech, новости без области, то есть везде. Никакой единой «области администратора» нет.
В строке это выглядит так:
panel.revenue.read доходность по всем серверам
panel.revenue.read.hitech доходность только по HiTechСерверами режутся:
| Раздел | Права |
|---|---|
| Сводка | Видеть сводку по покупкам |
| Доходность | Смотреть доходность |
| Игроки | Менять игровую валюту, выдавать товары, выдавать донат |
| Серверы | Править серверы, выполнять команды по RCON |
| Магазин | Смотреть разделы магазина, товары и киты целиком |
| Донат | Смотреть разделы доната, донат-группы и донат-права целиком |
| Моды | Смотреть, править и удалять моды |
Счёт игрока разведён на три независимых права: Менять счёт игрока — деньги на сайте, Менять бонусы — бонусный счёт, Менять игровую валюту — валюта на серверах, и только она режется серверами. Серверное право не открывает ни счёт, ни бонусы.
Что режется, то и фильтруется: список товаров, китов, донат-групп, донат-прав и модов показывает только записи своих серверов, доходность — только свои строки, сводка по покупкам считается по своим серверам, а в карточке игрока видны балансы и выданный донат только своих серверов.
Запись проверяется по тому же правилу. Запись, которая стоит и на вашем сервере, и на чужом, правится свободно — цена и содержимое меняются на обоих, потому что запись одна. А вот привязку к чужому серверу менять нельзя: снять SkyTech у общего товара не выйдет, придёт отказ с названием сервера. Так админ одного сервера не уведёт товар у соседа.
Что порезать нельзя
Пополнения и регистрации к серверу не привязаны: платёж идёт на общий счёт игрока, регистрация — на сайте. Рекорды онлайна тоже общие. Эти права выдаются целиком или не выдаются вовсе. Учётка игрока одна на весь проект, поэтому «показывать только игроков своего сервера» тоже не выйдет — режутся его балансы и выдачи, а не сам список.
Создание и удаление серверов, сортировка серверов и правка категорий магазина областью не ограничиваются: они затрагивают весь проект.
Права на отдельные поля
Право открыть карточку и право поменять в ней конкретное поле — разные вещи. Правка карточки закрывается своим правом:
| Право | Что закрывает |
|---|---|
panel.users.field.email | Почта игрока |
panel.users.field.password | Пароль игрока |
panel.users.field.roles | Роли и личные права |
panel.users.field.superuser | Признак владельца |
panel.users.field.username | Ник |
panel.users.field.activated | Признак активации |
panel.servers.field.rcon | Адрес, порт и пароль RCON |
panel.store.products.field.price | Цена и скидка товара |
panel.store.products.field.commands | Команды, которые выполняет товар |
panel.donate.groups.field.price | Цена донат-группы |
panel.donate.groups.field.perms | Веб-права донат-группы |
panel.donate.permissions.field.price | Цена донат-права |
panel.donate.permissions.field.perms | Состав донат-права |
Без права поле в панели гаснет и рядом с подписью появляется замок. Сервер проверяет то же самое: правку примут, если значение поля не изменилось, и откажут, если изменилось. Так сотрудник может править описание товара, не трогая цену.
Нельзя выдать больше, чем есть у себя
Кто правит роли и личные права, видит в списке только те права, которые есть у него самого. Попытка выдать чужое право отклоняется с текстом «Нельзя выдать право «…»: его нет у вас».
Отдельно закрыта выдача прав панели: без panel.users.grant.panel человек раздаёт только права игрока.
Названия прав
Название и подсказка каждого права лежат в словаре переводов: ключи perm.<право> и perm.<право>.hint, названия разделов — perm.group.<раздел>. Их правят в Управление контентом → Локализация, как любую другую строку сайта.
Права-товары
Ветка player.* перечисляет, что игроку доступно на сайте. Часть этих прав продаётся вместе с привилегиями:
| Право | Что открывает |
|---|---|
player.skin.upload / player.skin.hd | Загрузка скина, обычного и HD |
player.cloak.upload / player.cloak.hd | То же для плащей |
player.transfer | Переводы другим игрокам |
player.exchange | Обмен реальной валюты на игровую |
player.unban.buy | Покупка разбана |
player.payment | Пополнение баланса |
player.donate.group.buy / player.donate.permission.buy | Покупка привилегий и прав |
player.twofactor.on / player.twofactor.off | Управление двухфакторной проверкой |
player.password.change | Смена своего пароля |
player.gift.activate | Активация промо-кодов |
player.gift.buy | Покупка подарков другим игрокам |
Чего игроку не разрешено, того он на сайте и не видит: блок перевода, обменник, кнопка покупки привилегии просто не появляются.
В донат уходят только `player.`
Веб-права, которые идут вместе с купленной привилегией, обрезаются по префиксу player.. Продать panel.* через донат не выйдет, даже если вписать его руками.
Две служебные роли
Сервер создаёт их сам при первом запуске и помечает как системные. Удалить такую роль нельзя, а содержимое править можно.
| ID | Название | Права | Кому |
|---|---|---|---|
default | Игрок | player.*, !player.skin.hd, !player.cloak.hd | Всем автоматически |
banned | Заблокированный | !player.transfer | Автоматически, пока действует бан |
В роли default игроку разрешено всё в кабинете, кроме HD-скинов и HD-плащей, потому что их продают. Если раздаёте HD бесплатно, уберите исключение из роли.
banned вешается и снимается сама, вместе с баном. Приоритет у неё выше, чем у default, поэтому её запреты побеждают. Всё, что нужно отобрать у заблокированного, дописывайте туда же с восклицательным знаком.
Оформление роли
Роль умеет не только раздавать права, но и помечать игрока на сайте. Настраивается там же, в карточке роли, блок «Оформление» с живым предпросмотром.
| Поле | Что делает |
|---|---|
| Цвет ника | Этим цветом ник выводится на сайте |
| Плашка с названием роли | Прямоугольник с названием роли рядом с ником |
| Цвет названия и цвет плашки | Цвета текста и фона плашки |
| Эффект | Градиент, переливающийся градиент или неоновое свечение |
| Картинка на фон | Растягивается по плашке и перекрывает цвет фона |
| Служебная роль | Обладатели роли попадают в состав команды на сайте |
| Процент с пополнений рефералов | Свой процент вместо общего из настроек — см. Рефералы |
Второй цвет появляется у градиентов: плашка переливается между ним и основным цветом. Картинку можно загрузить после того, как роль создана.
«Служебная роль» нужна модулю «Команда проекта»: он собирает страницу из тех, у кого есть служебная роль сайта или служебная привилегия. Роль сайта не привязана к серверу, поэтому такие люди встают в общий раздел, а обладатели привилегий — в раздел своего сервера.
Если у игрока несколько ролей, оформление берётся у той, у которой выше приоритет. Сторону плашки задаёт настройка «Плашка роли перед ником» в Основное → Настройки: включена — плашка слева от ника, выключена — справа.
Как раздавать доступы
Практика, которая не разваливается через полгода:
- Роль на команду, а не на человека:
moderator,shop-editor,support. - Начинать с узкого набора и расширять по запросу, а не наоборот.
- Владелец только для аварий, а не для повседневной работы.
- Личные права — исключение, а не правило.
Проверять удобнее всего вживую: зайдите под тестовым аккаунтом с новой ролью и посмотрите, что видно в панели. Разделы, на которые прав нет, просто не появятся, а кнопки и поля без прав — погаснут или исчезнут.