Привилегия — минимальная единица прав: она разрешает набор действий над одним объектом, репозиторием или административной областью. Пользователю привилегии не выдаются напрямую: их перечисляет роль, а пользователь получает роли (модель целиком — в разделе Управление доступом).

Все привилегии инсталляции видны на странице «Настройки» → «Права», фильтр по типу сужает список. Каталог наполняется автоматически: административные привилегии создаются при первом запуске, привилегии на репозиторий — вместе с самим репозиторием. Для большинства задач достаточно выбрать из каталога нужные имена.

Типы

Тип определяет, над чем привилегия работает и какие у неё поля.

ТипНад чем работаетПоля
repository-viewСодержимое репозитория: артефактыФормат, репозиторий, действия
repository-adminСам репозиторий: его настройки и существованиеФормат, репозиторий, действия
applicationАдминистративная область: пользователи, роли, привилегии, настройки, задачиДомен, действия

Одно и то же действие в двух семействах репозитория означает разное: add в repository-view — опубликовать артефакт, add в repository-admin — создать репозиторий.

Действия над содержимым

Привилегии repository-view оперируют пятью действиями:

ДействиеЧто разрешает
browseВидеть репозиторий и его содержимое в веб-интерфейсе
readСкачивать артефакты клиентом формата
addПубликовать новые артефакты
editИзменять уже опубликованное содержимое
deleteУдалять артефакты

Что разрешают read и browse, зависит от того, куда идёт запрос, и одинаково для всех форматов.

read покрывает всё, что клиент формата получает при обычной работе: и сам файл, и служебные списки, из которых он собирает зависимости, — maven-metadata.xml с контрольными суммами, список версий Go-модуля, дескриптор пакета npm, индексы PyPI, RubyGems и Cargo, список тегов образа. Сборочному агенту, который только скачивает, достаточно одного read.

browse нужен для веб-интерфейса: без него репозиторий не появится в разделе «Обзор», даже если из него можно качать. Карточка репозитория, списки компонентов и ассетов открываются по любому из двух действий.

Действия независимы: read не включает browse, edit не включает add. Иерархии «администрирование включает запись, запись включает чтение» нет — нужный набор действий указывается явно.

Исключение — публикация образов контейнеров: клиент запрашивает у реестра доступ и на чтение, и на запись сразу, поэтому для docker push нужны оба действия — read и add.

Действия над репозиторием

Привилегии repository-admin управляют самим репозиторием: его настройками и существованием.

ДействиеЧто разрешает
readПросматривать настройки репозитория
addСоздавать репозитории
editИзменять настройки, в том числе сбрасывать кеш proxy-репозитория
deleteУдалять репозиторий

Действие add — единственное, которое не относится к существующему репозиторию: в момент создания его ещё нет. Поэтому право создавать репозитории выдаётся привилегией, охватывающей не один репозиторий, а все сразу: nx-repository-admin-*-*-add разрешает создавать репозитории любого формата. Как устроены такие имена, разобрано ниже.

Административные области

Привилегии типа application закрывают операции, не связанные с конкретным репозиторием. Область называется доменом:

ДоменЧто закрывает
usersУчётные записи: создание, просмотр, изменение, удаление
rolesРоли
privilegesПривилегии
settingsСистемные настройки: анонимный доступ, цепочка реалмов, политики очистки
tasksЗадачи: просмотр состояния, запуск и приостановка
userschangepwСамостоятельная смена собственного пароля

Глаголы у административных привилегий свои: create, read, update, delete и all. Привилегия на изменение включает и чтение своей области: пользователь с nx-users-update видит список пользователей, отдельная nx-users-read для этого не нужна. У домена settings нет create и delete — настройки не создают и не удаляют, их читают и меняют.

Имена привилегий

Имена привилегий построены по шаблону, в который входят область или формат, репозиторий и действие. Зная шаблон, имя нужной привилегии можно составить самостоятельно и найти его в каталоге поиском:

  • nx-<DOMAIN>-<VERB> — административные: nx-users-create, nx-roles-read, nx-settings-update;
  • nx-repository-view-<FORMAT>-<REPOSITORY>-<ACTION> — содержимое: nx-repository-view-maven2-maven-releases-read;
  • nx-repository-admin-<FORMAT>-<REPOSITORY>-<ACTION> — сам репозиторий: nx-repository-admin-docker-docker-hosted-edit.

В позиции формата и репозитория допустима подстановка *: nx-repository-view-*-*-read — чтение во всех репозиториях, nx-repository-view-docker-*-browse — просмотр всех репозиториев формата Docker (OCI).

Из шаблона выпадают две привилегии:

  • nx-tasks-run — запуск задач и приостановка сборки мусора. Только эта привилегия даёт такое право: nx-tasks-read позволяет лишь смотреть состояние;
  • nx-userschangepw — самостоятельная смена пароля; не входит ни в одну роль по умолчанию (Первичная настройка).

Полный доступ ко всем операциям даёт встроенная привилегия nx-all — она входит в роль admin.

Откуда привилегии берутся

Каталог наполняется без участия администратора:

  • при первом запуске создаются административные привилегии по каждому домену и привилегии с подстановкой: на все репозитории сразу и на все репозитории каждого формата;
  • при создании репозитория появляется набор привилегий на него: на каждое действие с содержимым и на каждое действие с самим репозиторием. Удаляются они вместе с репозиторием.

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

Собственные привилегии

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

Встроенный каталог не покрывает один случай — администратор всех репозиториев одного формата. Готовые привилегии repository-admin с подстановкой есть только на все форматы сразу (nx-repository-admin-*-*-<ACTION>), а привилегия «все Maven-репозитории и никакие другие» создаётся вручную: тип repository-admin, формат maven2, репозиторий *, нужные действия.

Создать привилегию можно на странице «Настройки» → «Права» кнопкой «+ Новое право». Правила при создании:

  • Имя. Имена, начинающиеся с nx-, зарезервированы за встроенным каталогом. Для своих привилегий выберите другой префикс, например team-.
  • Формат и репозиторий. Если указан конкретный репозиторий, он должен существовать и принадлежать выбранному формату: привилегия с форматом maven2 и репозиторием docker-hosted не создастся. Если в позиции репозитория стоит *, формат всё равно должен быть одним из поддерживаемых Galleon.
  • Домен. Домен административной привилегии со списком доменов не сверяется. Опечатка вроде user вместо users ошибки не вызовет: привилегия сохранится, её можно будет включить в роль, но прав она не даст ни на одну операцию. Сверяйтесь с таблицей доменов выше.

Удаляя репозиторий, удалите и созданные вручную привилегии на него. Автоматические удаляются вместе с ним, а ваши остаются в ролях и снова начнут действовать, если репозиторий с тем же именем и форматом создадут заново.

Типовые роли

Что положить в роль под конкретную задачу:

ЗадачаПривилегии
Сборочный агент только скачиваетnx-repository-view-*-*-read
Сборочный агент публикует в один репозиторийnx-repository-view-<FORMAT>-<REPOSITORY>-add; для образов контейнеров добавьте -read
Разработчик работает через веб-интерфейсbrowse и read на нужные репозитории
Администратор репозиториев одного форматаСобственная привилегия repository-admin с форматом docker и * в позиции репозитория, действия read, edit, delete — управление всеми репозиториями Docker (OCI) и никакими другими
Дежурный по обслуживаниюnx-tasks-read и nx-tasks-run — видеть состояние сборки мусора, запускать её и ставить на паузу

Роль собирается на странице «Настройки» → «Роли». В роль можно включить другие роли: пользователь с такой ролью получает и её собственные привилегии, и привилегии включённых в неё ролей. Те тоже могут содержать роли, и привилегии собираются по всей цепочке. Так делают базовую роль с общими правами и добавляют её в роли команд. Роль нельзя включить в саму себя, в том числе через промежуточные роли: сервер отклонит такую вложенность.