4

我正在使用带有 postgres 数据库的 prisma 和 yoga graphql 服务器。

我想为我的 graphql 查询实现授权。我看到像graphql-shield这样的解决方案column level security很好地解决了 - 这意味着我可以定义一个权限并根据它阻止或允许特定的数据表或列(在 graphql 术语中,阻止整个实体或特定字段)。

我坚持的部分是row level security- 通过它们包含的数据过滤行 - 说我想允许登录用户只查看与他相关的数据,所以根据 user_id 列中的值我会允许或阻止访问该行(登录用户是一个例子,但在这一类型中还有其他用例)。

这种类型的安全性需要运行查询来检查当前用户可以访问哪些行,而我找不到使用 prisma 实现这一点的方法(这并不可怕)。

如果我在没有 prisma 的情况下工作,我会在每个解析器的级别实现这一点,但由于我将查询转发到 prisma,我不控制嵌套查询的内部解析器。

但我确实想使用 prisma,所以我们的一个想法是使用 postgres policy在数据库级别处理这个问题。这可以按如下方式工作:

  1. 我们运行的每个查询都会被“开始事务”和“提交事务”包围</li>
  2. 在查询之前我想运行“将本地 context.user_id 设置为 5”
  3. 然后我想运行查询(策略会根据 current_setting('context.user_id') 过滤结果)

为此,我需要 prisma 来允许我向每个运行的查询添加前/后查询,或者让我为数据库设置上下文。

但是这些选项在 prisma 中不可用。

有任何想法吗?

4

2 回答 2

2

您可以使用prisma-client而不是prisma-binding.

使用prisma-binding,您可以定义顶级解析器,然后将所有嵌套委托给 prisma

另一方面,prisma-client 只返回一个类型的标量值,你需要为关系定义解析器。这意味着您可以完全控制返回的内容,即使对于嵌套查询也是如此。(有关示例,请参阅文档)

我建议您使用prisma-client在字段上应用您的安全过滤器。

于 2018-12-10T09:53:34.167 回答
0

使用您要采用的方法,我绝对建议您查看Graphile。它以与您所想的基本相同的方式接近行级安全性。不幸的是,Prisma 似乎并不能帮助您摆脱在这方面编写传统的 REST 风格的控制器方法。

于 2019-09-23T23:57:56.133 回答