gpt4 book ai didi

postgresql - 使用 prisma 和 postgres 的行级安全性

转载 作者:行者123 更新时间:2023-11-29 11:46:33 25 4
gpt4 key购买 nike

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

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

我坚持的部分是行级别安全性 - 按行包含的数据过滤行 - 假设我想允许登录用户仅查看与他相关的数据,所以根据 user_id 列中的值,我将允许或阻止对该行的访问(登录用户是一个示例,但在这一类型中还有其他用例)。

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

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

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

  1. 我们运行的每个查询都将被“开始交易”和“提交交易”包围
  2. 在查询之前我想运行“set local context.user_id to 5”
  3. 然后我想运行查询(策略将根据 current_setting(‘context.user_id’) 过滤结果)

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

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

有什么想法吗?

最佳答案

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

使用 prisma-binding,您可以定义顶级解析器,然后委托(delegate)给 prisma 进行所有嵌套。

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

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

关于postgresql - 使用 prisma 和 postgres 的行级安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53683009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com