【问题标题】:AWS AppSync Subscriptions: Complex Authorization based on Object with in Updated DocumentAWS AppSync 订阅:基于更新文档中的对象的复杂授权
【发布时间】:2019-03-21 14:40:02
【问题描述】:

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

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

我认为这没有什么不同(因为我无法在客户端安全地处理这个问题),但我正在构建一个 React Web 客户端。

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

【问题讨论】:

    标签: amazon-web-services subscription aws-appsync appsync-apollo-client


    【解决方案1】:

    一种可能的解决方案是设置一个订阅所有新突变的服务器端作业。此服务器端侦听器将接收每个新突变,查看权限列表,并使用 None 数据源解析器发布给授权用户。用户只能使用其用户 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 是短暂的?
    猜你喜欢
    • 2019-06-15
    • 2019-02-08
    • 2018-12-20
    • 2019-02-14
    • 2018-07-04
    • 2018-09-30
    • 2019-09-16
    • 2019-12-27
    • 2021-09-20
    相关资源
    最近更新 更多