基于属性的访问控制

可以创建基于节点属性的读取权限。每个基于属性的权限只能被单个属性限制。要指定读取权限的属性/值条件,使用下面描述的 `pattern` 语法,有关读取权限语法的更多信息,请参阅 读取权限 页面。

添加基于属性的访问控制可能会在某些情况下导致显著的性能开销。有关更多详细信息,请参阅 限制。为了减少性能影响,建议使用块存储格式,因为它针对解决基于属性的权限所需的读取类型进行了更好的优化。

以下是一些可能会在存在属性规则时加剧性能影响的因素:

  • 相关节点上的属性数量(属性越多,性能影响越大)

  • 基于属性的权限数量(基于属性的权限越多,性能影响越大)。

  • 权限类型:`TRAVERSE` 基于属性的权限比 `READ` 基于属性的权限具有更大的性能影响。

  • 正在使用的存储介质类型。访问磁盘存储将大大放大基于属性的权限的性能影响。

对于性能关键场景,建议根据标签设计权限。有关更多信息,请参阅 读取权限

使用基于属性的访问控制时,确保用于规则的属性不可修改。可以更改此属性的用户会影响授予的基于属性的权限。

模式语法

([var][:label["|" ...]] "{" property: value "}")
| (var[:label["|" ...]]) WHERE [NOT] var.property { { = | <> | > | >= | < | <= } value | IS NULL | IS NOT NULL | IN { "["[value[, ...]]"]" | listParam } }
| (var[:label["|" ...]] WHERE [NOT] var.property { { = | <> | > | >= | < | <= } value | IS NULL | IS NOT NULL | IN { "["[value[, ...]]"]" | listParam } } )

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

该角色不需要具有用于基于属性的权限的属性的 `READ` 权限。

您可以使用以下模式语法定义读取权限

GRANT ... ON GRAPH ... FOR pattern TO ...
授予角色 regularUsers 对域 exampledomain.comEmailWebsite 节点的 address 属性进行 READ 权限
GRANT READ { address } ON GRAPH * FOR (n:Email|Website) WHERE n.domain = 'exampledomain.com' TO regularUsers

或者,您可以使用以下语法

GRANT READ { address } ON GRAPH * FOR (:Email|Website {domain: 'exampledomain.com'}) TO regularUsers
授予角色 regularUsers 对标签为 Email 且属性 classificationNULL 的节点进行 TRAVERSE 权限
GRANT TRAVERSE ON GRAPH * FOR (n:Email) WHERE n.classification IS NULL TO regularUsers
拒绝角色 regularUsers 对属性 classificationUNCLASSIFIED 不相同的节点进行 READTRAVERSE 权限
DENY MATCH {*} ON GRAPH * FOR (n) WHERE n.classification <> 'UNCLASSIFIED' TO regularUsers
授予角色 regularUsers 对属性 securityLevel 大于 3 的节点的所有属性进行 READ 权限
GRANT READ {*} ON GRAPH * FOR (n) WHERE n.securityLevel > 3 TO regularUsers

角色 regularUsers 不需要对属性 securityLevel 具有 READ 权限,该属性由基于属性的权限使用。

拒绝角色 regularUsers 对属性 classification 不包含在 [UNCLASSIFIED, PUBLIC] 列表中的节点的所有属性进行 READ 权限
DENY READ {*} ON GRAPH * FOR (n) WHERE NOT n.classification IN ['UNCLASSIFIED', 'PUBLIC'] TO regularUsers