我正在使用带有Postgres DB的prisma和Yoga graphql服务器。
我想为我的graphql查询实现授权。我看到像graphql-shield这样的解决方案很好地解决了column level security
-这意味着我可以定义一个权限,并根据它来阻止或允许特定的数据表或数据列(以graphql的术语来说,可以阻止整个实体或特定字段)。
我停留的部分是row level security
-用行包含的数据过滤行-说我想允许登录的用户仅查看与他相关的数据,因此取决于我将允许或禁止访问该行的user_id列(登录的用户是一个示例,但此类型中还有其他用例)。
这种类型的安全性要求运行查询以检查当前用户可以访问哪些行,而我找不到找到一种方法(这并不可怕)来使用Arizonaa。
如果我没有使用pyramida,则可以在每个解析器的级别上实现此功能,但是由于我将查询转发到pyramida,所以我不控制嵌套查询的内部解析器。
但是我确实想与prisma一起工作,因此我们曾经想到的一个想法是使用postgres policy在数据库级别处理此问题。这可能如下:
要使其正常工作,我将需要prisma允许我向运行的每个查询添加前/后查询,或者让我为数据库设置上下文。
但是这些选项在棱镜中不可用。
有什么想法吗?
答案 0 :(得分:2)
您可以使用prisma-client
代替prisma-binding
。
使用prisma-binding
,您可以定义顶级解析器,然后委派给pyramida 以进行所有嵌套。
另一方面,prisma-client
仅返回类型的标量值,并且您需要定义关系的解析器。这意味着您可以完全控制返回的内容,即使是嵌套查询也是如此。 (有关示例,请参见documentation)
我建议您使用prisma-client
在字段上应用安全过滤器。
答案 1 :(得分:0)
使用您要采用的方法,我绝对建议您看看Graphile。它本质上接近您正在考虑的行级安全性the same way。不幸的是,在这方面,Prisma似乎并没有帮助您摆脱编写传统的REST风格的控制器方法的麻烦。