我正在使用带有 postgres 数据库的 prisma 和 Yoga graphql 服务器。
我想为我的 graphql 查询实现授权。我看到了类似的解决方案graphql 屏蔽 https://github.com/maticzav/graphql-shield解决column level security
很好 - 意味着我可以定义一个权限,并根据它阻止或允许特定的表或数据列(在 graphql 术语中,阻止整个实体或特定字段)。
我坚持的部分是row level security
- 按行包含的数据过滤行 - 假设我希望允许登录用户仅查看与他相关的数据,因此根据 user_id 列中的值,我将允许或阻止对该行的访问(已登录的用户) in user 就是一个例子,但这种类型还有其他用例)。
这种类型的安全性需要运行查询来检查当前用户有权访问哪些行,但我找不到一种方法(这并不可怕)来使用 prisma 实现此目的。
如果我在没有 prisma 的情况下工作,我会在每个解析器的级别实现此功能,但由于我将查询转发到 prisma,所以我不控制嵌套查询上的内部解析器。
但我确实想使用 prisma,所以我们的一个想法是使用 postgres 在数据库级别处理这个问题policy https://www.postgresql.org/docs/9.5/sql-createpolicy.html。这可以按如下方式工作:
- 我们运行的每个查询都会被“开始事务”和“提交事务”包围
- 在查询之前我想运行“set local context.user_id to 5”
- 然后我想运行查询(策略将根据 current_setting('context.user_id') 过滤结果)
为此,我需要 prisma 来允许我向运行的每个查询添加前/后查询,或者让我为数据库设置上下文。
但这些选项在 prisma 中不可用。
有任何想法吗?
您可以使用prisma-client
代替prisma-binding
.
With prisma-binding
,您定义顶级解析器,然后棱镜代表对于所有的嵌套。
另一方面,prisma-client
仅返回标量值类型,并且您需要定义关系的解析器。这意味着您可以完全控制返回的内容,即使对于嵌套查询也是如此。 (参见文档 https://www.prisma.io/docs/get-started/03-build-graphql-servers-with-prisma-JAVASCRIPT-e001/#implement-resolver-functions举个例子)
我建议你使用prisma-client
在字段上应用安全过滤器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)