读取权限

有三种独立的读取权限

  • TRAVERSE - 启用查找指定的实体。

  • READ - 启用读取找到的实体的指定属性。

  • MATCH - 结合 TRAVERSEREAD,启用查找实体并读取其属性。

有关语法描述的更多详细信息,请参阅 管理命令的 Cypher 语法

TRAVERSE 权限

用户可以通过 GRANT TRAVERSE 权限获得查找节点和关系的权利。

GRANT [IMMUTABLE] TRAVERSE
  ON { HOME GRAPH | GRAPH[S] { * | name[, ...] } }
    [
      ELEMENT[S] { * | label-or-rel-type[, ...] }
      | NODE[S] { * | label[, ...] }
      | RELATIONSHIP[S] { * | rel-type[, ...] }
      | FOR pattern
    ]
  TO role[, ...]

有关用于表达基于属性的访问控制规则的 pattern 语法的更多详细信息,请参见 基于属性的访问控制

例如,您可以允许具有 regularUsers 角色的用户在 neo4j 数据库中查找所有标签为 Post 的节点。

GRANT TRAVERSE ON GRAPH neo4j NODES Post TO regularUsers

TRAVERSE 权限也可以被拒绝。

DENY [IMMUTABLE] TRAVERSE
  ON { HOME GRAPH | GRAPH[S] { * | name[, ...] } }
    [
      ELEMENT[S] { * | label-or-rel-type[, ...] }
      | NODE[S] { * | label[, ...] }
      | RELATIONSHIP[S] { * | rel-type[, ...] }
      | FOR pattern
    ]
  TO role[, ...]

例如,我们可以禁止具有 regularUsers 角色的用户查找所有标签为 Payments 的节点。

DENY TRAVERSE ON HOME GRAPH NODES Payments TO regularUsers

尽管您刚刚授予 regularUsers 角色读取标签为 Post 的节点上所有属性的权限,但您可能希望使用 基于属性的访问控制 将其细化,以隐藏 secret 属性设置为 true 的帖子。例如

DENY TRAVERSE ON HOME GRAPH FOR (:Post {secret: true}) TO regularUsers

如果数据库中不存在标签或关系类型,则用户无法使用相应的权限,直到创建该标签或关系类型。有关更多信息,请参见 不存在的标签、关系类型和属性名称的权限

READ 权限

用户可以通过 GRANT READ 权限获得对节点和关系执行属性读取的权利。需要注意的是,用户只能读取他们被授权查找的实体上的属性。

GRANT [IMMUTABLE] READ "{" { * | property[, ...] } "}"
  ON { HOME GRAPH | GRAPH[S] { * | name[, ...] } }
    [
      ELEMENT[S] { * | label-or-rel-type[, ...] }
      | NODE[S] { * | label[, ...] }
      | RELATIONSHIP[S] { * | rel-type[, ...] }
      | FOR pattern
    ]
  TO role[, ...]

有关用于表达基于属性的访问控制规则的 pattern 语法的更多详细信息,请参见 基于属性的访问控制

例如,您可以允许具有 regularUsers 角色的用户读取 neo4j 数据库中标签为 Post 的节点上的所有属性。* 表示读取所有属性的能力也扩展到将来可能添加的属性。

GRANT READ { * } ON GRAPH neo4j NODES Post TO regularUsers

为了进一步细化读取访问权限,您可以允许具有 regularUsers 角色的用户读取 neo4j 数据库中标签为 Postsecret 属性未设置为 true 的节点上的所有属性。例如

GRANT READ { * } ON GRAPH neo4j FOR (n:Post) WHERE n.secret <> true TO regularUsers

授予属性 READ 访问权限并不意味着可以找到具有该属性的实体。例如,如果在同一个实体上也存在 DENY TRAVERSEGRANT READ,则 Cypher MATCH 语句将找不到该实体。

READ 权限也可以被拒绝。

DENY [IMMUTABLE] READ "{" { * | property[, ...] } "}"
  ON { HOME GRAPH | GRAPH[S] { * | name[, ...] } }
    [
      ELEMENT[S] { * | label-or-rel-type[, ...] }
      | NODE[S] { * | label[, ...] }
      | RELATIONSHIP[S] { * | rel-type[, ...] }
      | FOR pattern
    ]
  TO role[, ...]

尽管我们刚刚授予 regularUsers 角色读取所有属性的权限,但我们可能希望隐藏 secret 属性。以下示例演示了如何执行此操作

DENY READ { secret } ON GRAPH neo4j NODES Post TO regularUsers

如果数据库中不存在标签、关系类型或属性名称,则用户无法使用相应的权限,直到创建该标签、关系类型或属性名称。有关更多信息,请参见 不存在的标签、关系类型和属性名称的权限

MATCH 权限

用户可以通过 GRANT MATCH 权限获得查找节点和关系并对它们执行属性读取的权利。这在语义上等同于同时拥有 TRAVERSEREAD 权限。

GRANT [IMMUTABLE] MATCH "{" { * | property[, ...] } "}"
  ON { HOME GRAPH | GRAPH[S] { * | name[, ...] } }
    [
      ELEMENT[S] { * | label-or-rel-type[, ...] }
      | NODE[S] { * | label[, ...] }
      | RELATIONSHIP[S] { * | rel-type[, ...] }
      | FOR pattern
    ]
  TO role[, ...]

有关用于表达基于属性的访问控制规则的 pattern 语法的更多详细信息,请参见 基于属性的访问控制

例如,如果您想授予 regularUsers 角色读取标签为 Message 的节点的 languagelength 属性以及查找这些节点的能力,您可以使用以下 GRANT MATCH 查询

GRANT MATCH { language, length } ON GRAPH neo4j NODES Message TO regularUsers

以下查询授予 regularUsers 角色查找 secret 属性设置为 falsePostLikes 节点以及读取其所有属性的能力。

GRANT MATCH { * } ON GRAPH neo4j FOR (n:Post|Likes) WHERE n.secret = false TO regularUsers

与所有其他权限一样,MATCH 权限也可以被拒绝。

DENY [IMMUTABLE] MATCH "{" { * | property[, ...] } "}"
  ON { HOME GRAPH | GRAPH[S] { * | name[, ...] } }
    [
      ELEMENT[S] { * | label-or-rel-type[, ...] }
      | NODE[S] { * | label[, ...] }
      | RELATIONSHIP[S] { * | rel-type[, ...] }
      | FOR pattern
    ]
  TO role[, ...]

请注意,拒绝 MATCH 权限的效果取决于是否指定了具体的属性键或 *。如果您指定了具体的属性键,则 DENY MATCH 仅拒绝读取这些属性。查找要遍历的元素的功能仍然可用。如果您改为指定 *,则元素的遍历和所有属性读取都将被禁用。以下查询将显示此示例。

拒绝 regularUsers 角色读取标签为 Message 的节点上的 content 属性,将如下所示。尽管无法读取此特定属性,但仍然可以遍历具有该标签的节点(并且,根据其他授予的权限,仍然可以读取其上的其他属性)。

DENY MATCH { content } ON GRAPH neo4j NODES Message TO regularUsers

以下查询举例说明了如果您想拒绝读取 neo4j 数据库中标签为 Account 的所有节点的所有属性以及遍历这些节点,查询将是什么样子。

DENY MATCH { * } ON GRAPH neo4j NODES Account TO regularUsers

如果数据库中不存在标签、关系类型或属性名称,则用户无法使用相应的权限,直到创建该标签、关系类型或属性名称。有关更多信息,请参见 不存在的标签、关系类型和属性名称的权限