使用prisma和postgres的行级安全

时间:2018-12-08 13:29:51

标签: postgresql graphql prisma row-level-security prisma-graphql

我正在使用带有Postgres DB的prisma和Yoga graphql服务器。

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

我停留的部分是row level security-用行包含的数据过滤行-说我想允许登录的用户仅查看与他相关的数据,因此取决于我将允许或禁止访问该行的user_id列(登录的用户是一个示例,但此类型中还有其他用例)。

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

如果我没有使用pyramida,则可以在每个解析器的级别上实现此功能,但是由于我将查询转发到pyramida,所以我不控制嵌套查询的内部解析器。

但是我确实想与prisma一起工作,因此我们曾经想到的一个想法是使用postgres policy在数据库级别处理此问题。这可能如下:

  1. 我们运行的每个查询都会被“开始交易”和“提交交易”包围
  2. 在查询之前,我要运行“将local context.user_id设置为5”
  3. 然后我要运行查询(该策略将根据current_setting('context.user_id')过滤结果

要使其正常工作,我将需要prisma允许我向运行的每个查询添加前/后查询,或者让我为数据库设置上下文。

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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用prisma-client代替prisma-binding

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

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

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

答案 1 :(得分:0)

使用您要采用的方法,我绝对建议您看看Graphile。它本质上接近您正在考虑的行级安全性the same way。不幸的是,在这方面,Prisma似乎并没有帮助您摆脱编写传统的REST风格的控制器方法的麻烦。