Postgresql 使用prisma和postgres的行级安全性

Postgresql 使用prisma和postgres的行级安全性,postgresql,graphql,prisma,row-level-security,prisma-graphql,Postgresql,Graphql,Prisma,Row Level Security,Prisma Graphql,我正在使用prisma和瑜伽graphql服务器以及postgres DB 我想为我的graphql查询实现授权。我看到这样的解决方案很好地解决了列级安全性问题,这意味着我可以定义一个权限,并根据它阻止或允许特定的表或数据列(在graphql术语中,阻止整个实体或特定字段) 我一直关注的部分是行级安全性——根据行中包含的数据过滤行——比如我希望允许登录用户仅查看与其相关的数据,因此根据用户id列中的值,我将允许或阻止对该行的访问(登录用户就是一个例子,但在这种类型中还有其他用例) 这种类型的安全

我正在使用prisma和瑜伽graphql服务器以及postgres DB

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

我一直关注的部分是
行级安全性
——根据行中包含的数据过滤行——比如我希望允许登录用户仅查看与其相关的数据,因此根据用户id列中的值,我将允许或阻止对该行的访问(登录用户就是一个例子,但在这种类型中还有其他用例)

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

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

但我确实想与prisma合作,所以我们有一个想法,就是使用postgres在DB级别处理这个问题。这可以如下所示:

  • 我们运行的每个查询都将被“开始事务”和“提交事务”包围
  • 在查询之前,我想运行“将local context.user_id设置为5”
  • 然后我想运行查询(策略将根据当前的_设置('context.user_id')过滤结果)
  • 为此,我需要prisma允许我向运行的每个查询添加前/后查询,或者让我为db设置上下文

    但这些选项在prisma中不可用


    有什么想法吗?

    您可以使用
    prisma客户端
    而不是
    prisma绑定

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

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


    我建议您使用
    prisma客户端
    在字段上应用安全过滤器。

    对于您希望采用的方法,我绝对建议您看看。它本质上是您所考虑的行级安全性。不幸的是,prisma似乎无法帮助您摆脱编写传统REST-这方面的样式控制器方法。

    如果没有架构,我无法给出明确的答案,但您是否尝试使用((id)::name=SESSION\u USER)创建策略会话用户是用来连接数据库的角色。我假设您正在使用
    prisma binding
    进行转发。也许使用
    prisma client
    会是一个更好的选择,因此您可以在解析器中实现此逻辑?(这也适用于嵌套查询)关于会话用户,我通过prisma与db的连接总是使用相同的用户和角色。用户是在应用程序级别管理的,而不是db。我甚至不认为每个查询prisma都有一个特定的角色是可能的。如果可能的话,它可以解决问题。有可能吗?我遗漏了什么?