AWS Amplify GraphQL 按动态 Cognito 用户组筛选

AWS Amplify GraphQL filter by dynamic Cognito User Group

给定以下 AWS Amplify GraphQL 架构 (schema.graphql):

type Organization
  @model
  @auth(rules: [
    { allow: groups, groups: ["Full-Access-Admin"], mutations: [create, update, delete], queries: [list, get] },
    { allow: owner },
    { allow: groups, groupsField: "orgAdminsCognitoGroup", mutations: null, queries: [list, get] }
  ]) {
    id: ID!
    name: String!
    address: String!
    industry: [String]!
    owner: String
    orgAdminsCognitoGroup: String
  }

我可以通过以下过滤掉除属于当前认证用户的组织之外的所有组织:

        res = await API.graphql(graphqlOperation(listOrganizations, {
            // todo: filter by owner OR by is org admin
            filter: {
                owner: {
                    eq: this.props.currentUser.username
                }
            }
        }));

但无论如何也可以通过 orgAdminsCognitGroup 进行过滤,这是 Cognito 中属于该组织的动态组吗?我没有发现任何成功尝试使用额外的 @model 来帮助 @auth 规则来保护每个实体。

所以,问题是要过滤用户是其所有者或在 'orgAdminsCognitoGroup'?

中的组

我认为这是可能的,尽管我认为最好的方法不是您所想的那样。相反,我可能会建议您设置一个响应映射模板,为您执行一些服务器端过滤。

具体来说,您将首先从当前用户的身份验证令牌中获取组:

#set($claimPermissions = $ctx.identity.claims.get("cognito:groups"))

然后您可以遍历结果中的每个组织。如果任何人的所有者是当前用户,请将他们添加到响应列表中。如果不是,请继续检查 orgAdminsCognitoGroup。您可以通过检查 $claimPermissions 是否包含 orgAdmin 为该组织设置的组来做到这一点。如果包含,则将其添加到响应列表中。如果不是,忽略它并继续迭代。

从理论上讲,可以使用用户登录时使用的令牌来执行此客户端操作。与响应映射模板所做的大致相同,用户所在的组位于令牌内。如果你打开它并拉出组,你可以在那里应用过滤。出于安全原因,我建议不要这样做,尽管这是可能的。