【问题标题】:Is there a way to know if gremlin query is read query or write query有没有办法知道 gremlin 查询是读查询还是写查询
【发布时间】:2020-04-27 10:47:18
【问题描述】:

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

【问题讨论】:

    标签: gremlin tinkerpop janusgraph tinkerpop3 gremlin-server


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢@stephen-mallette 的指导。目前,我们可以完全禁止脚本。我在身份验证后添加授权,将其添加为单独的步骤,因为在 websocket 的情况下,我们执行一次身份验证,但必须对每个请求实施授权。任何具有写入步骤的查询对我来说都是写入查询,即使它是“运行时只读”查询。
    • 现在,我必须将字符串中的这个 gremlin 查询转换为步骤列表,我指的是 TraversalOpProcessor 的代码。有没有更好的办法?
    • 在我向您解释如何最好地做到这一点时,我发现您的道路上有一些障碍,这使您更难做到这一点,尽管您可以轻松地检查变异遍历并禁用脚本。我有一个建议,这是一个简单的解决方法,需要最少的代码和更改,但它可能不适合您的用例。很简单,配置两个遍历源实例,一个带ReadOnlyStrategy,一个不带。在您的授权步骤中,针对他们打算使用的遍历源授权用户,以确保他们可以这样做。这行得通吗?
    • 感谢@stephen-mallette,我相信它对我们有用,让我试试吧。
    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2022-01-04
    • 2019-03-13
    • 2011-04-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多