基于属性的访问控制
可以创建基于节点属性的读取权限。每个基于属性的权限只能被单个属性限制。要指定读取权限的属性/值条件,使用下面描述的 `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.com
上 Email
或 Website
节点的 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
且属性 classification
为 NULL
的节点进行 TRAVERSE
权限GRANT TRAVERSE ON GRAPH * FOR (n:Email) WHERE n.classification IS NULL TO regularUsers
拒绝角色
regularUsers
对属性 classification
与 UNCLASSIFIED
不相同的节点进行 READ
和 TRAVERSE
权限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
对属性 classification
不包含在 [UNCLASSIFIED, PUBLIC]
列表中的节点的所有属性进行 READ
权限DENY READ {*} ON GRAPH * FOR (n) WHERE NOT n.classification IN ['UNCLASSIFIED', 'PUBLIC'] TO regularUsers