【问题标题】:AWS Amplify GraphQL filter by dynamic Cognito User GroupAWS Amplify GraphQL 按动态 Cognito 用户组过滤
【发布时间】:2019-06-02 21:20:18
【问题描述】:

鉴于以下 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 规则来保护每个实体,我没有发现任何成功。

【问题讨论】:

  • 你能详细说明一下这个问题吗?我不太确定我是否理解。您是否正在尝试查找当前登录用户有权访问哪些组的组织?或者你只是想过滤一个特定的组,单数?
  • 我正在尝试查询该用户有权访问的所有组织,然后我想过滤这些结果,以便返回的唯一组织是我拥有或参与的组织该组织的管理员。换句话说,因为Full-Access-Admin 组而返回给我的所有组织,我都想过滤掉。

标签: graphql aws-appsync aws-amplify


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 嗯,好吧,这是我有点担心的事情。因为我还不知道如何创建自己的解析器,所以我不确定在哪里放置这段代码。您能推荐任何资源或指出正确的方向吗?
  • 当然,解析器中的 VTL 可能很棘手。首先,如果您不想花费大量精力让解析器工作,有两种选择:我上面的最后一段,并改用 Lambda 解析器。 Lambda 解析器将使您能够以您选择的语言处理后处理,并且仍将提供服务器端过滤的好处。它假设首先调用您的数据存储,然后根据所有者和组过滤结果(已破解打开令牌),然后返回这些结果。这有意义吗?
  • 如果您决定要采用解析器的想法,控制台中内置了一些示例,可以帮助您获得灵感。如果您转到解析器页面,您会在两个模板右侧看到一个下拉菜单,上面写着“选择一个示例模板”。根据请求,您将看到“Cognito 用户池组访问权限”。这有多个你需要的部分,不过,我还是建议它在响应中。同样,作为回应,“只有在我的群组中可见时才返回”。
猜你喜欢
  • 2021-09-28
  • 2017-09-02
  • 2020-04-05
  • 2021-08-31
  • 2020-08-02
  • 2019-05-25
  • 2020-12-22
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多