我正在使用带有 postgres 数据库的 prisma 和 yoga graphql 服务器。
我想为我的 graphql 查询实现授权。我看到像graphql-shield这样的解决方案column level security
很好地解决了 - 这意味着我可以定义一个权限并根据它阻止或允许特定的数据表或列(在 graphql 术语中,阻止整个实体或特定字段)。
我坚持的部分是row level security
- 通过它们包含的数据过滤行 - 说我想允许登录用户只查看与他相关的数据,所以根据 user_id 列中的值我会允许或阻止访问该行(登录用户是一个例子,但在这一类型中还有其他用例)。
这种类型的安全性需要运行查询来检查当前用户可以访问哪些行,而我找不到使用 prisma 实现这一点的方法(这并不可怕)。
如果我在没有 prisma 的情况下工作,我会在每个解析器的级别实现这一点,但由于我将查询转发到 prisma,我不控制嵌套查询的内部解析器。
但我确实想使用 prisma,所以我们的一个想法是使用 postgres policy在数据库级别处理这个问题。这可以按如下方式工作:
- 我们运行的每个查询都会被“开始事务”和“提交事务”包围</li>
- 在查询之前我想运行“将本地 context.user_id 设置为 5”
- 然后我想运行查询(策略会根据 current_setting('context.user_id') 过滤结果)
为此,我需要 prisma 来允许我向每个运行的查询添加前/后查询,或者让我为数据库设置上下文。
但是这些选项在 prisma 中不可用。
有任何想法吗?