Appsync Fine Graine Control для мутации с несколькими таблицами

У меня есть следующая схема, где автор события может делать заметки о событии. Только автор мероприятия должен иметь возможность создавать заметки. Я храню author в случае. Однако я обнаружил, что другие пользователи могут создавать заметки о событии, которое они не создали, просто передавая eventId события другого пользователя, например, так:

mutation {
  noteOnEvent(input: { eventId: "***", content: "A comment"}) {
    eventId
    content
  }
}

Как я могу предотвратить это? Я не вижу способа доступа к автору EventTable в noteOnEvent распознаватель

схема

type Note {
    eventId: ID!
    notetId: ID!
    content: String
    author: String

}

input CreateNoteInput {
    eventId: ID!
    noteId: String!
    content: String
}

type Event {
    id: ID!
    name: String
    author: String 
    notes: [Note]
}

1 ответ

Решение

Вы можете сделать это с помощью Nested Resolver.

Если вы слегка измените свою схему, вы можете сделать это следующим образом:

type EventCheckedNote {
  // Add a resolver on note which creates the note. The event will be available as $cxt.source, and you can make an authZ check before making the mutation.
  note: Note
}

type Mutation {
  // Add a resolver on noteOnEvent which queries the Event table.
  noteOnEvent(input: CreateNoteInput!): EventCheckedNote
}

Вот руководство по использованию вложенных распознавателей для выполнения проверок авторизации с использованием нескольких источников данных: https://hackernoon.com/graphql-authorization-with-multiple-data-sources-using-aws-appsync-dfae2e350bf2

Другие вопросы по тегам