通过动态Cognito用户组的AWS Amplify GraphQL过滤器

最后发布: 2019-01-08 08:00:11


问题

给定以下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进行过滤, orgAdminsCognitGroup是Cognito中属于该组织的动态组? 我没有发现尝试使用其他@model帮助@auth规则来保护每个实体的任何成功。

graphql aws-appsync aws-amplify
回答

因此,问题是要过滤用户是其所有者或在“ orgAdminsCognitoGroup”中的组?

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

具体来说,您首先要从当前用户的auth令牌中获取组:

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

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

从理论上讲,可以使用用户登录时使用的令牌在客户端进行此操作。 响应映射模板的实现方式几乎相同,用户所在的组位于令牌内部。 如果您将其打开并拉出组,则可以在其中进行过滤。 尽管出于安全考虑,我建议不要这样做。