AWS Amplify GraphQL 查询 - 列出所有元素并在不同视图中过滤所有者的元素

Posted

技术标签:

【中文标题】AWS Amplify GraphQL 查询 - 列出所有元素并在不同视图中过滤所有者的元素【英文标题】:AWS Amplify GraphQL query - list all elements and filter the owner's ones in different view 【发布时间】:2020-08-27 11:54:08 【问题描述】:

我已经创建了简单的 grapql 架构:

type Announcement @model @auth(
  rules: [ allow: owner ])
  id: ID!
  name: String!
  selectedTags: String!
  owner: String!
  price: Float
  description: String!
  image: S3Object
  createdAt: String

AWS Amplify 为我生成 listAnnouncements 查询,让我可以获取其所有者的所有公告,因此在所有者的帐户中,我只会看到他创建的那些。在单独的视图中,我想列出由其他用户创建的所有公告。

我认为问题在于我访问查询的方式,因此我检查了 AWS Amplify 中的 <UserContext><Connect> 方法,但看起来它并没有解决问题。

有没有办法让用户获得对所有公告的读取权限,并且只能修改他创建的那些?

【问题讨论】:

您的应用程序是否允许访客用户?如果没有,您可以将所有用户添加到组中,或者使用管理员查询 api docs.amplify.aws/cli/auth/admin#enable-admin-queries 手动添加,或者在他们注册/登录时使用 cognito 触发器等。然后您可以添加此规则:allow: groups, groups: [ "yourGroupName"], operations: [read] 如果您允许来宾用户使用您的应用程序,我认为您必须使用具有多种身份验证类型的可能性(使用 api-key / iam 角色)。看看这篇文章:aws.amazon.com/blogs/mobile/graphql-security-appsync-amplify 它没有,所以我更新了你提到的 graphQL 模式,但是当我遇到一些错误时,我已经更新了放大。在那次更新之后,我失去了与我使用放大功能的服务的连接 - 你知道是否有一个选项可以重复使用以前的设置,或者我需要重新设置吗? 你使用git吗?如果是这样,您也许可以将其设置回以前的版本,然后再次运行放大推送 【参考方案1】:

您可以这样做的一种方法是为您的api (amplify update api) 设置多种身份验证模式,例如,您可以将 Cognito 设置为默认身份验证模式,而 IAM 作为辅助模式。一旦设置好(和amplify pushed),您就可以在您的模型上添加身份验证规则:

type Announcement @model @auth(
  rules: [
     allow: owner 
     allow: public, provider: iam, operations: [read] 
  ]
)

您还需要在 AWS 控制台中进入 Cognito 并在您的身份池中启用未经身份验证的访问:

仔细检查是否为 Auth 和 UnAuth 角色设置了首选角色,然后选中 ✅ 那个小框,上面写着“启用对未经身份验证的身份的访问”。

最后,您需要tweak your code to tell the Amplify graphQL client to use IAM for those unauthenicated queries,例如:

return API.graphql( queries.MyQuery, variables, 'AWS_IAM' )

到目前为止,我已经在几个项目中使用了它,希望对您有所帮助!

【讨论】:

以上是关于AWS Amplify GraphQL 查询 - 列出所有元素并在不同视图中过滤所有者的元素的主要内容,如果未能解决你的问题,请参考以下文章

带有 AWS Amplify 的 GraphQL - 如何启用对查询的排序

AWS Amplify GraphQL - 一对多连接在查询时返回空列表

如何在 aws amplify 中使用 graphQL 限制

使用 AWS Amplify Auth 和 GraphQL API,您将如何进行一些公共和一些私有查询/突变调用?

AWS Amplify GraphQL 查询 - 列出所有元素并在不同视图中过滤所有者的元素

在 AWS Amplify GraphQL DynamoDB 中按另一个表的字段(也称为交叉表或嵌套过滤)过滤列表查询