查询发送到Prisma服务器/数据库之前的访问控制过滤

时间:2018-08-14 07:36:18

标签: prisma prisma-graphql

现在,我正在使用accesscontrol来管理ACL,它运行良好。看起来像这样:

const methods = {
  async update(parent, { data }, ctx, info) {
    const acUpdate = ac.can('role').updateOwn('model')
    if (! acUpdate.granted) throw new ACError()

    const filtered = acUpdate.filter({ ...data })
    return await ctx.db.mutation.updateOrganization({
      data: filtered,
      where: { id }
    }, info)
  }
}

但是,在GraphQL的Query方法上,我不知道如何过滤对数据库的请求。例如,在嵌套查询中,它可能看起来像这样:

{
  model {
    id
    name
    user {
      id
      name
      pictures {
        id 
        name
      }
    }
  }
}

因此,在解析器上,它将检查他们是否有权访问模型,然后将请求发送到Prisma服务器,而不过滤GQL模式。在这种情况下,假设用户有权读取模型,但用户无权。理想情况下,我想在将实际请求架构(信息?)发送给Prisma之前对其进行permission.filter(...)。你们有没有解决这个问题?当然,可以在解决请求后过滤该请求,但是该级别的计算不是必需的,并且如果滥用该请求会引起问题。

2 个答案:

答案 0 :(得分:0)

我发现这是我在一个问题回复中要解决的主题,因为我以为有人问过。现在,我意识到我一定对它感到困惑,因为可以在后面的一个选项卡中打开它。

https://github.com/maticzav/graphql-shield/issues/113#issuecomment-423766569

我认为答复的第二部分最关注您。我希望你觉得这对你有帮助!

答案 1 :(得分:0)

我遇到了完全相同的问题,现在我通过使用prisma客户端向prisma发出请求来解决它。 Prisma客户端每次只查询一个深层次的内容,因此您也可以在嵌套查询中完全控制解析器。 参见https://stackoverflow.com/a/53703140/1391050