【问题标题】:Authorization in Amplify GraphQLAmplify GraphQL 中的授权
【发布时间】:2021-08-19 03:35:42
【问题描述】:

我正在 Amplify 中实现一个项目,并有 3 种 GraphQL 模式类型,如下所示。它是一个具有不同用户类型的多租户应用程序。

type Seller
@model
@auth (rules: [
   { allow: owner, ownerField: "id", operations: [read, update] },
])
{
   id: ID!
   name: String
   ...
}


type Customer
@model
@auth (rules: [
   { allow: owner, ownerField: "id", operations: [read, update] },
])
{
   id: ID!
   name: String
   ...
}


type Order
@model
@auth (rules: [
   { allow: owner, ownerField: "seller_id", operations: [create, read, update, delete] },
   { allow: owner, ownerField: "customer_id", operations: [read] },
])
{
   id: ID!
   seller_id: ID
   seller: Seller @connection(fields: ["seller_id"])
   customer_id: ID
   customer: Customer @connection(fields: ["customer_id"])
   quantity: Int
   product: String
   ...
}

当 Customer 类型的用户登录并调用 listOrders 时,它会为属性“sellers”返回 null,这可能是因为 Seller 的 @auth 规则只允许所有者读取访问权限。我可以通过在卖方中放置一个组规则来解决这个问题,如下所示:

type Seller
...
@auth (rules: [
...
   { allow: groups, groups: ["Customer"], operations: [read] },
...

但是,客户现在可以查询所有卖家(通过 listSellers 或 getSellers),我不希望他们这样做。

有没有办法定义授权,以便如果客户在 Order 上获得授权,并且 Order 包含对象卖方,则允许对该卖方进行授权?

【问题讨论】:

  • 更新:我尝试关闭卖家查询 (@model(queries: null))。这样就保证了Seller info只能通过Order.seller属性查询,当然有Sellers不能查询自己的效果。

标签: aws-amplify


【解决方案1】:

我明白你在这里的目的,但我认为你的策略有点偏离。我相信你在这里真正想要做的是拥有Group Authorization

想象一下,您有客户和卖家组。当客户注册时,他们被放置到客户组中,当卖家注册时,他们被放置到卖家组中。这将使您可以更好地控制组及其允许的操作。您可能希望为卖家和客户使用Dynamic Group Authorization,以便特定卖家只能与他们的客户合作。

另外,我认为您可以将自定义所有者简化为仅使用 default owner capability that is default with Amplify

【讨论】:

  • 感谢您的回复。我已经定义了卖方和客户(以及管理员)Cognito 组以及确认后 lambda 触发器,以便在注册时将用户添加到各自的组中。我的目标是——为了安全——限制谁可以在卖家上运行 listQueries。我只希望卖家自己查询。我希望客户仅通过每个订单的“卖家”属性查询他们已下订单的卖家。我不希望卖家或客户询问他们可能没有任何订单/从属关系的卖家。
猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 2022-10-24
  • 2017-09-28
  • 2019-11-12
  • 2017-05-03
  • 2022-01-18
  • 1970-01-01
  • 2018-11-05
相关资源
最近更新 更多