Подписки AWS AppSync: комплексная авторизация на основе объекта в обновленном документе - PullRequest
0 голосов
/ 17 октября 2018

Объект, который будет изменен мутацией, содержит массив permissions, который содержит user объекты, которые состоят из логических значений userId и write.Если в списке присутствует пользователь userId, пользователь имеет разрешение на чтение объекта.Если для write установлено значение true, у пользователя также есть разрешение на запись.

Это упрощает изменение объекта с точки зрения мутации, но значительно усложняет обработку подписок, поскольку у меня нет доступа кобъект обновляется при создании подписки.Таким образом, я не могу гарантировать, что пользователь будет получать обновления объекта только при наличии соответствующих разрешений.

Я не думаю, что это имеет значение (поскольку я не могу справиться с этим на клиентестороны), но я создаю веб-клиент React.

Есть ли способ обойти это?

1 Ответ

0 голосов
/ 23 октября 2018

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

Схема будет выглядеть примерно так:

type Object {
  permissions: [User]
  //.. Other fields
}

type User {
  userId: ID!
  write: Boolean
}

// The server listener will populate this
type PublishPayload {
  userId: ID!
  objectToPublish: Object
}

type Mutation {
  // The original mutation
  updateObject(): Object

  // The server-side listener will use this to publish. Attach a None Resolver to it.
  publishToUser(userId: ID!): PublishPayload
}

type Subscription {
  // This subscription is used by the server to listen to all updateObject mutations
  serverSubscription(): Object
  @aws_subscribe(mutations:["updateObject"])

  // This subscription is used by the users. 
  // You would add a resolver to it that fails authorization if they try to subscribe to a different user.
  userSubscription(userId: ID!): PublishPayload
  @aws_subscribe(mutations:["publishToUser"])

//.. More schema

Надеюсь, это поможет!

...