有没有办法知道 gremlin 查询是读查询还是写查询

Is there a way to know if gremlin query is read query or write query

我正在尝试在 gremlin-server 中添加基本的 read/write 授权,我想知道是否有一种方法可以识别此查询是只读查询还是写入查询。

您无法通过 API 调用来确定这一点,但您可以从 ReadOnlyStrategy here 中获得有关如何检测它的灵感。关键是循环Traversal对象,寻找实现了Mutating接口的Step。如果您在其中找到其中一个,则可以将遍历归类为写入查询。

当然,对于 Gremlin 来说,对查询和读取或写入进行分类并不是二元的,因为它很容易成为读取和写入的混合。也有可能在运行时写入可能永远不会执行,具体取决于遍历的流程,因此它可能是 "runtime readonly"。希望检测 Mutating 接口对您来说是一个足够好的解决方案。

我不确定您打算在哪里实现此授权功能,但我认为最好将其作为 TraversalStrategy 完成,然后在遍历执行时触发。我不知道这对您的授权过程来说是否为时已晚,但这是我能想到的最简单的方法。问题是,如果您接受脚本,那么通过这种方法,您可能会部分执行该脚本,直到不允许授权为止。如果您需要基于一次写入遍历来禁止整个脚本,那么您可能需要查看 custom sandbox。当然,最好完全避免使用脚本,只使用基于字节码的请求。如果您只关心字节码,那么 TraversalStrategy 应该可以很好地用于授权用例。