读取权限

存在三种独立的读取权限

  • TRAVERSE - 允许找到指定的实体。

  • READ - 允许读取已找到实体的指定属性。

  • MATCH - 结合了 TRAVERSEREAD,允许查找实体并读取其属性。

有关如何阅读管理命令语法的更多详细信息,请参阅 阅读管理命令语法图权限命令的组成部分

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)。

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 数据库中 Post 标签节点上 secret 属性未设置为 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

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