Access Control
Access ControlУправление доступом

Управление доступом

Included in the “Power Extensions” bundle

Предоставляет детальный доступ к схеме в зависимости от того, вошёл ли пользователь в систему (или нет), имеет ли определённую роль или возможность, и не только.

Описание

Это расширение позволяет создавать Списки управления доступом для управления тем, кто может обращаться к различным элементам (операциям, полям и директивам) схемы GraphQL.

На сайте добавляется новый Custom Post Type «Список управления доступом». Просматривать его записи можно на странице «Списки управления доступом» в меню, а для добавления новой записи нужно нажать «Добавить новый список управления доступом» в редакторе.

Списки управления доступом
Списки управления доступом
Редактор списка управления доступом
Редактор списка управления доступом

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

Создание списка управления доступом

Список управления доступом назначается нужному эндпоинту (приватному эндпоинту, единственному эндпоинту, пользовательским эндпоинтам или persisted queries) через Конфигурацию схемы.

Выбор списка управления доступом в конфигурации схемы
Выбор списка управления доступом в конфигурации схемы

При выполнении GraphQL-запроса, если он содержит какие-либо из выбранных элементов схемы из Списка управления доступом, производится оценка выбранных правил.

Если хотя бы одно правило не выполняется, доступ к данной операции, полю или директиве запрещается, и можно настроить способ формирования ответа API:

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

Например, в публичном режиме ответ может выглядеть так:

{
  "errors": [
    {
      "message": "You must have role 'author' to access field 'title' for type 'Post'",
      "locations": [
        {
          "line": 86,
          "column": 3
        }
      ]
    }
  ]
}

А в приватном режиме ответ может выглядеть так:

{
  "errors": [
    {
      "message": "There is no field 'title' on type 'Post'",
      "locations": [
        {
          "line": 86,
          "column": 3
        }
      ]
    }
  ]
}

Список правил управления доступом

Расширение предоставляет следующие правила управления доступом:

  • Запретить доступ
  • Предоставить доступ только если пользователь вошёл в систему или вышел из неё
  • Предоставить доступ только если пользователь имеет определённую роль
  • Предоставить доступ только если пользователь имеет определённую возможность