Amazon web services AWS AppSync订阅:基于更新文档中的对象的复杂授权

Amazon web services AWS AppSync订阅:基于更新文档中的对象的复杂授权,amazon-web-services,subscription,aws-appsync,appsync-apollo-client,Amazon Web Services,Subscription,Aws Appsync,Appsync Apollo Client,将被变异更改的对象包含一个权限数组,该数组包含用户对象,该对象由用户ID和写入权限布尔值组成。如果列表中存在用户的userId,则该用户对该对象具有读取权限。如果write设置为true,则用户也具有写入权限 从突变的角度来看,这使得修改对象变得更容易,但这使得处理订阅变得更加困难,因为我无法访问订阅创建时正在更新的对象。因此,我无法确保用户只有在拥有适当权限的情况下才能获得对象的更新 我不认为这有什么区别(因为我不能在客户端安全地处理这个问题),但我正在构建一个React web客户端 有没有

将被变异更改的对象包含一个
权限
数组,该数组包含
用户
对象,该对象由
用户ID
写入
权限布尔值组成。如果列表中存在用户的
userId
,则该用户对该对象具有读取权限。如果
write
设置为true,则用户也具有写入权限

从突变的角度来看,这使得修改对象变得更容易,但这使得处理订阅变得更加困难,因为我无法访问订阅创建时正在更新的对象。因此,我无法确保用户只有在拥有适当权限的情况下才能获得对象的更新

我不认为这有什么区别(因为我不能在客户端安全地处理这个问题),但我正在构建一个React web客户端


有没有可行的方法来解决这个问题?

一个可能的解决方案是设置一个订阅所有新变种的服务器端作业。此服务器端侦听器将接收每个新的变异,查看权限列表,并使用无数据源解析程序发布给授权用户。用户将只能使用其用户id订阅订阅

该模式将如下所示:

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

希望这有帮助

那是个好主意。今晚我会试一试,让你知道进展如何。我忍不住觉得,总的来说,为了使用AppSync作为SaaS提供商,我正在应用大量的“变通方法”,但我认为在价格方面没有比它更好的了。我只是希望它能够继续保持下去。在这种情况下,服务器端侦听器不需要是EC2实例或容器吗,因为Lambda是短期的?