1

我使用 AWS 的 Amplify 创建了一个 GraphQL API。在架构中,我有一个如下所示的 Comment 模型:

type Comment
  @auth(rules: [{ allow: owner }, { allow: private, operations: [read] }, { allow: public, operations: [read] }])
  @model
  @key(name: "byAuthor", fields: ["authorID"])
  @key(name: "byPost", fields: ["postID"]) {
  content: String!
  createdAt: AWSDateTime!
  id: ID!
  owner: String
  postID: ID!
  updatedAt: AWSDateTime!
}

这赋予所有者创建、读取、更新和删除的权限,并将未经身份验证/经过身份验证的非所有者用户限制为只读。这按预期工作;但是,所有者可以更新 ownerField 的值,本质上是将评论归因于另一个用户……这是一个禁忌。为了防止这种情况,我尝试使用字段级权限(见下文);但是,这似乎并没有停止更新。

...
owner: String @auth(rules: [{ allow: owner, operations: [ create ]}])
...

有什么我想念的吗?非常感谢任何帮助-谢谢!

4

1 回答 1

3

你很亲密。使用字段级@auth指令,您希望显式授予所有者权限createread显式拒绝世界权限updatedelete。它可能看起来像:

type Todo
    @model
    @auth(rules: [{ allow: owner, ownerField: "author" }]) {
    id: ID!
    name: String!
    author: String
        @auth(
            rules: [
                { allow: groups, groups: ["FORBIDDEN"], operations: [update, delete] }
                { allow: owner, ownerField: "author", operations: [create, read] }
            ]
        )
}

这里,“FOBIDDEN”组是不存在的组。它的名称可以是任何名称,只要您将来不打算使用该名称实际创建组即可。因为没有用户会拥有“FORBIDDEN”组声明,所以该字段上的任何/全部updatedelete操作都将失败。

于 2021-02-23T16:46:31.617 回答