如何防止更新 AWS Amplify GraphQL API 的 ownerField?

Posted

技术标签:

【中文标题】如何防止更新 AWS Amplify GraphQL API 的 ownerField?【英文标题】:How do you prevent updates to the ownerField of an AWS Amplify GraphQL API? 【发布时间】:2021-05-21 20:11:38 【问题描述】:

我使用 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 ]])
...

我有什么遗漏吗?非常感谢任何帮助 - 谢谢!

【问题讨论】:

我尝试将***身份验证规则设置为仅允许所有者的创建、读取和删除操作,并更改内容字段上的字段级身份验证以更新以查看是否相反会工作,我仍然可以更新所有者字段。 【参考方案1】:

你很亲密。使用字段级@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] 
            ]
        )

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

【讨论】:

以上是关于如何防止更新 AWS Amplify GraphQL API 的 ownerField?的主要内容,如果未能解决你的问题,请参考以下文章

防止 AWS Amplify 添加斜杠和强制重定向

Aws Amplify:部分更新(突变)

如何获取和更新用户属性 AWS amplify angular 6

无法使用 aws-amplify 从 cognito 获取更新的属性及其值

将 NodeJS 运行时从 8.10 更新到 10.x 或 12.x - AWS Amplify

为啥 AWS amplify 无法识别更新的节点版本?