UnicoreCMS

Роли и права

Как устроены права, маски, опасные права и права на отдельные поля

Право — это строка с точками: panel.users.read. Маска со звёздочкой выдаёт всё, что ниже неё, восклицательный знак снимает право. Кто настраивал права на игровом сервере, узнает логику сразу.

В панели права не набираются руками: Основное → Роли, карточка роли, блок «Права» — это список разделов с человеческими названиями и подсказками. Отметка у названия раздела включает весь раздел разом.

Из чего складываются права

Источников четыре, и все они попадают в один список:

  1. Роли. Обычный способ: у каждой есть имя, приоритет и набор прав.
  2. Личные права пользователя. Дописываются к ролевым.
  3. Донат. Купленные привилегии могут добавлять права ветки player..
  4. Владелец. Этот признак перекрывает всё: у такого аккаунта есть каждое право в системе.

Синтаксис

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.
  • Начинать с узкого набора и расширять по запросу, а не наоборот.
  • Владелец только для аварий, а не для повседневной работы.
  • Личные права — исключение, а не правило.

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

Содержание