首页 > 解决方案 > 如何使用 AppSync GraphQL 转换为双向一对多 @connection 执行字段级别 @auth?

问题描述

我试图弄清楚如何在字段级别保护一对多@connection@auth防止不应允许的突变。(即:拒绝特定用户运行突变,最终以另一个用户的身份插入帖子。)

从在字段级别保护突变的示例开始:https ://aws-amplify.github.io/docs/cli/graphql#field-level-authorization

我试着做这样的事情:

type User @model @auth(rules: [{ allow: owner, ownerField: "id" }]) {
  id: ID!
  posts: [Post]
    @connection(name: "UserPosts")
    @auth(rules: [{ allow: owner, ownerField: "id" }])
}

type Post @model {
  title: String!
  user: User!
    @connection(name: "UserPosts")
    @auth(rules: [{ allow: owner, ownerField: "userPostId" }])
}

然后说已经有一个 id 的用户regular-user-id 显然我的身份验证规则不会阻止另一个用户,比如 id of:malicious-user-id来运行这个突变:

mutation {
  createPost(input:{
    title:"Oh this is BAD!"
    postUserId: "regular-user-id"
  }) {
    title
  }
}

运行一个简单的查询以确保这确实发生了:

query {
  getUser(id:"regular-user-id"){
    posts{
      items
      {
        title
      }
    }
  }
}
=> 
{
  "data": {
    "getUser": {
      "posts": {
        "items": [
          {
            "title": "Regular User title"
          },
          {
            "title": "Oh this is BAD!"
          },
        ]
      }
    }
  }
}

我尝试了各种方法来解决这个问题,但找不到任何有关双向字段级身份验证的文档。我对 AppSync 还很陌生,所以我想我一定没有得到任何东西,但是这是如此常见的用例场景,我真的很惊讶没有更多关于它的文档。

一些帮助将不胜感激。

标签: graphqlaws-amplifyaws-appsync

解决方案


恶意用户应该能够更新Post标题吗?我知道这不是您问题的确切答案,因为您专注于关系领域,但是通过尝试了解如何自己做这些事情,我阅读了一些关于引入某种形式的“每个人”组的内容因此您可以为非所有者的用户定义身份验证。然后你可以对整个Post模型进行身份验证,这样只有所有者才能更新任何字段;

type Post 
  @model 
  @auth(rules: [
    { allow: owner, ownerField: "userPostId" },
    { allow: groups, groups: ["everyone"], operations: [read] }
  ]) {
  title: String!
  user: User!
    @connection(name: "UserPosts")
}

我是一个超级新手(我目前正在评估是否将它用于我正在开始的项目),所以我在这里可能完全错了。如果您确实想要一个只有参考字段具有身份验证的半开放模型,我不知道该怎么做:(


推荐阅读