Как проверить разрешения сущности при создании в appsync - PullRequest
0 голосов
/ 19 февраля 2019

Извините за неопределенный заголовок.Однако мне трудно описать это.

Я использую aws-appsync с aws cognito для аутентификации.

Я следовал документам по усилению по поводу аннотации @authдля обработки разрешений на мутации и запросы.

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

Запись также имеет несколько заметок.(И еще несколько полей)

type Entry @model @versioned @auth (rules: [
  { allow: owner },
  { allow: owner, ownerField: "shared", queries: [get, list], mutations: []}
])  @searchable {
  id: ID!
  date: AWSDate
  updated_at: AWSDateTime
  text: String
  notes: [Note] @connection(name: "EntryNotes")
  shared: [String]!
}

А вот примечание

type Note @model @versioned @auth (rules: [{ allow: owner }]) {
  id: ID!
  text: String
  track: Track!
  diary: DiaryEntry @connection(name: "EntryNotes")
}

Пока все работает отлично.Но проблема в соединении Note.Потому что, если вы создадите заметку, вы создадите ее следующим образом:

mutation makeNote {
  createNote (input: {
    text: "Hello there!"
    noteEntryId: "444c80ee-6fd9-4267-b371-c2ed4a3ccda4"
  }) {
    id
    text
  }
}

Проблема в том, что вы можете создавать заметки для записей, к которым у вас нет доступа.Если вы каким-то образом узнаете, какой у них идентификатор.

Можно ли проверить, есть ли у вас права доступа к записи, до создания заметки?

1 Ответ

0 голосов
/ 20 февраля 2019

В настоящее время лучший способ сделать это - с помощью пользовательских распознавателей в Amplify CLI.В частности, вы можете использовать преобразователи конвейеров AppSync для проверки прав доступа перед созданием заметки.Ваш преобразователь конвейера будет содержать две функции.Первый будет искать запись и сравнивать владельца с $ ctx.identity.Вторая функция будет обрабатывать запись записи в DynamoDB.Вы можете использовать ту же логику, что и в build/resolvers/Mutation.createNote.re(q|s).vtl, чтобы реализовать вторую функцию, скопировав ее в каталог resolvers/ верхнего уровня и затем сославшись на нее из своего пользовательского ресурса.После копирования логики вы захотите отключить мутацию createNote по умолчанию, изменив @model на @model(mutations: { update: "updateNote", delete: "deleteNote" }).

Для получения дополнительной информации о настройке пользовательских распознавателей см. https://aws -amplify.github..io / документы / кли / graphql # надстройки а-обычая-распознаватель-что-мишени-а-dynamodb стол-от-модели .Для получения дополнительной информации о преобразователях конвейера (немного отличающихся от примера в документах для усиления) см. https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html. Также см. Справочные документы CloudFormation для AppSync https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-reference-appsync.html.

Заглядывая в будущее, мы работаем наддизайн, который позволит вам определять правила авторизации, которые охватывают @connections.Когда это будет сделано, он автоматически настроит этот шаблон, но пока еще не установлена ​​дата выпуска.

...