使用 prisma 和 postgres 的行级安全性

2024-01-24

我正在使用带有 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。这可以按如下方式工作:

  1. 我们运行的每个查询都会被“开始事务”和“提交事务”包围
  2. 在查询之前我想运行“set local context.user_id to 5”
  3. 然后我想运行查询(策略将根据 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(使用前将#替换为@)

使用 prisma 和 postgres 的行级安全性 的相关文章

随机推荐

  • 在机器对机器场景中使用 MSAL 作为 CSP

    我正在尝试使用官方 nuget 库来使用 GraphAPI https github com microsoftgraph msgraph sdk dotnet https github com microsoftgraph msgraph
  • 播放框架WS url空间

    我在 play 框架 2 3 3 中调用 WS url 时遇到问题 其中 url 包含空格 所有其他字符均自动进行 url 编码 但空格除外 当我尝试将所有空格更改为 20 时 WS 由于 字符而将其转换为 2520 对于空格 我得到了 j
  • 为什么锁定 std::mutex 两次“未定义行为”?

    按照这个article http www devx com SpecialReports Article 38883 1954 如果您尝试从同一线程两次锁定非递归互斥锁 而中间没有解锁 则会出现未定义的行为 我非常天真的想法告诉我为什么他们
  • Neo4j 2.0 双类型转储

    在 Neo4j 2 0 社区 上 当我转储包含一些具有 Double 类型属性的节点的数据库时 我获得一个具有科学记数法值的文件 ex 1 43524185E8 导入此文件时 neo4j shell 失败并出现以下错误 Invalid in
  • 在 Eclipse (App Engine) 项目中包含 JAR 文件

    我今天和昨天几个小时都在寻找这个问题的解决方案 所以我决定在这里解决它 尽管这似乎是一个愚蠢的问题 情况 我在 Eclipse Java EE 中设置了一个 Google AppEngine 项目 它已经存在了好几个星期 一切都运行良好 我
  • Linux 上的共享库有哪些好的做法?

    我最近阅读了很多有关 Linux 上共享库的内容 以下是我学到的内容 共享库应该嵌入一个soname包括其主要版本号 就像是 libfoo so 1 其真实文件名还应包含次要版本号 就像是 libfoo so 1 0 当库文件被复制到时 比
  • 如何动态重新加载 Oracle APEX 5.0 树

    当触发事件 例如单击按钮 时 我需要使用新参数重新加载完整树 设置项目值并且需要在 Tree SQL 中使用新项目值 当我尝试使用 刷新 操作刷新树区域时 树节点不刷新 树小部件支持一整套高级操作 问题是 apex 团队从未向开发人员公开过
  • 时间轴值在某些 ggplot 图中不正确,但在其他图中则不然

    Forum 这是我的数据的样子 gt data cvg Source local data frame 938 x 5 Date Day Time Parameter Value time fctr time chr dbl 1 2016
  • 什么 Java 方法接受 int 并返回 +1 或 -1?

    什么 Java 方法需要一个int并返回 1或 1 其判断标准是是否int是正的还是负的 我浏览了文档 但我不擅长阅读它 所以找不到它 我知道我在某处见过它 Integer signum int i http java sun com ja
  • 将参数传递给BAT文件并双击运行

    我想将两个文件路径 对于 Windows 作为命令行参数传递给脚本 在 Windows 中 如果我们右键单击一个文件 我们可以看到 属性 选项 并且在 常规 选项卡下显示像 test bat 这样的文件名 我们可以从那里传递参数吗 实际上我
  • 了解Elasticsearch的write_consistency和quorum规则

    根据elasticsearch文档 write consistency级别仲裁的规则是 法定人数 gt 副本 2 1 使用 ES 0 19 10 在具有 16 个分片 3 个副本的设置中 我们将得到 16 个主分片 48 个复制品 运行 2
  • 带队列的长时间运行的 REST API

    我们正在实现一个 REST API 它将启动多个长时间运行的后端任务 我一直在阅读 RESTful Web Services Cookbook 建议返回 HTTP 202 Accepted 并带有指向正在处理的任务的 Content Loc
  • 使用 RxSwift、驱动程序并绑定到 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我第一次问问题 我正在学习RxSwift 如何使用bind to和driver driver和bind to有什么区别 现在还有谁在学习Rx
  • 如何按色调/图例组用百分比注释分组条形图

    我想根据色调在条形顶部添加百分比 这意味着所有红色和蓝色条分别等于 100 我可以使蓝色条等于 100 但红色条不能 哪些部分需要修改 导入和样本数据 import pandas as pd import numpy as np impor
  • 如何使用 $resource 操作设置自定义标头?

    使用 http 我们可以这样做 var config headers something anything http get url to json config success function do something 我想对 reso
  • VS 2017 版本 15.3.x 中的标签助手智能感知不起作用

    在 Visual Studio 2017 的过去版本中 如果开发人员想要拥有标签助手智能感知 他们需要安装 Razor 语言服务 如此答案中所示 Visual Studio 2017 中的 ASP NET Core 标记帮助程序 Intel
  • 手动触发钻取事件,highcharts

    我正在研究 highchart 的向下钻取 向上图表 我能够通过以下方式从 highchart 外部单击点来触发向下钻取事件 chart series 0 data 0 firePointEvent click event 但我找不到任何会
  • 在ajax调用期间创建会话(php-xajax)

    除非完全必要 否则我需要避免在应用程序中创建会话 我注意到 如果会话未启动 xajax 调用将无法正常工作 我的第一个方法是在 xajax 函数的开头创建会话 如果不存在 但是 它不起作用用户第一次调用该调用 自会话创建以来第二次调用 有什
  • 如果局部(但未使用)变量是对对象的唯一强引用,那么符合标准的 C# 编译器是否可以优化它?

    另请参阅这些相关资源 NET 垃圾收集器是否执行代码预测分析 https stackoverflow com questions 3161119 does the net garbage collector perform predicti
  • 使用 prisma 和 postgres 的行级安全性

    我正在使用带有 postgres 数据库的 prisma 和 Yoga graphql 服务器 我想为我的 graphql 查询实现授权 我看到了类似的解决方案graphql 屏蔽 https github com maticzav gra