使用 AWS AppSync(带放大),如何允许经过身份验证的用户进行只读访问,但只允许对象所有者进行更改?

Using AWS AppSync (with amplify), how does one allow authenticated users read-only access, but only allow mutations for object owners?

我使用 Cognito 用户池作为默认身份验证方法。我也在为我的 lambda 后端使用 iam。我在一些自定义解析器的 lambda 函数中使用 aws appsync 客户端。

假设我有一个基本如下所示的用户对象类型:

type User {
  id: ID!
  displayName: String!
}

我希望能够做什么:

  1. 允许对象所有者完全 read/write 访问。
  2. 允许 lambda 函数(使用 iam)完全 read/write 访问。
  3. 允许通过 Cognito 用户池进行身份验证但不是对象所有者的用户进行只读访问。

我一直在使用 @auth 指令进行挑选和刺激,试图获得我正在寻找的结果,但没有任何效果。我查看了 AWS GraphQL Transform Docs 上的文档,我似乎有点困惑。

这是我尝试过的方法:

type User
  @model
  @auth(rules: [
    { allow: owner, operations: [create, update, delete] }
    { allow: private, provider: iam, operations: [update, delete] }
  ]) {
  id: ID!
  displayName: String!
}

据我了解,通过从 @auth 指令中的操作列表中删除读取,可以删除对获取和列表查询的检查。我究竟做错了什么?我怎样才能达到我想要的结果?

编辑:澄清一下,我已经启用了多种授权类型。 (默认情况下使用 cognito 用户池,lambda 解析器使用 iam)。我的问题是:如何使用 @auth 指令获得预期结果?

要同时启用 IAM 和 Cognito,您需要按照有关使用多种授权类型的说明进行操作:https://aws.amazon.com/blogs/mobile/using-multiple-authorization-types-with-aws-appsync-graphql-apis/

例如在各自的字段上指定 @aws_iam 或 @aws_cognito_user_pools

对于您的用例,您可能还需要在解析器中添加一些代码来控制哪些用户可以执行哪些操作,如中所述:https://docs.aws.amazon.com/appsync/latest/devguide/security-authorization-use-cases.html

例如按照#if($context.result["Owner"] == $context.identity.username)

如果您希望纯粹通过 Amplify CLI 执行此操作,此人似乎已经解决了一个非常相似的问题:https://github.com/aws-amplify/amplify-cli/issues/2694

AuthProvider { apiKey iam oidc userPools }


所以,我希望这可以帮助你(它对我有用:-))

type User @model @auth(rules:  [
      { allow: owner ,operations:  [create, update, delete]},
      { allow: private, provider: iam, operations: [read, update, delete] }
      { allow: private, provider: userPools, operations: [read] }
    ]) {
  id: ID!
  name: String!
}