Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在neo4j中实现自定义用户访问权限?_Neo4j_Permissions_Cypher - Fatal编程技术网

如何在neo4j中实现自定义用户访问权限?

如何在neo4j中实现自定义用户访问权限?,neo4j,permissions,cypher,Neo4j,Permissions,Cypher,需要在使用Neo4j的应用程序中分层定义访问策略 模型:应用程序使用树结构,每个节点只有一个父节点,可以表示为 (:Node)-[:SUBTREE_OF]->(:Node) 为了简单起见 还有一些用户是具有权限的组的成员。权限包含两个属性:objectId(包含为其设置权限的对象的ID)和accessLevel(可以是WRITE、READ或NONE) 所以 问题:需要为可由其所有子对象继承的对象指定权限访问级别。这意味着需要在运行时确定特定用户对特定节点的访问级别,如果指定了该对象的指定

需要在使用Neo4j的应用程序中分层定义访问策略

模型:应用程序使用树结构,每个节点只有一个父节点,可以表示为

(:Node)-[:SUBTREE_OF]->(:Node)
为了简单起见

还有一些用户是具有权限的组的成员。权限包含两个属性:objectId(包含为其设置权限的对象的ID)和accessLevel(可以是WRITE、READ或NONE)

所以

问题:需要为可由其所有子对象继承的对象指定权限访问级别。这意味着需要在运行时确定特定用户对特定节点的访问级别,如果指定了该对象的指定权限,则使用该对象的指定权限;如果未指定权限,则使用最近的指定父权限

如何编写将返回指定节点或最近父节点的accessLevel属性的查询?

现在,您的:权限通过objectID属性与:节点和:应用程序相关联,但对于使用图形关系的有效查询,这可能应建模为与对象本身的关系。此时的问题是accessLevel是否应存储在:Permission节点中,或者是否希望完全删除:Permission节点并使用带有accessLevel属性的:HasPermission关系对其进行建模

我假设您现在想保留:权限节点

假设:用户只能是一个:组的成员,则获取:节点或其:节点祖先的权限的查询类似于:

MATCH (:User{ID:123})-[:MEMBER_OF]->(group:Group), (node:Node{ID:123})
WITH group, node
// looking for a :Node going up the chain with a permission from your group
OPTIONAL MATCH (node)-[jumps:SUBTREE_OF*0..]->(target:Node)<-[:HasPermission]-(perm:Permission)<-[:WITH]-(group)
WITH node, target, perm, jumps
ORDER BY SIZE(jumps) LIMIT 1
RETURN target,  COALESCE(target = node, false) as same_node, COALESCE(perm.accessLevel, "WRITE") as accessLevel
返回包括我们最终在其上匹配的目标:节点,如果我们在层次结构中找不到该节点,则该节点将为null,并默认为写入访问级别,相同的\u节点表示我们要获取权限的:节点是否为具有权限的节点false表示我们找到了具有权限的祖先,还是默认的,accessLevel是关联权限的访问级别。您可能不需要所有这些,但是测试它是否正常工作是很有用的

编辑

记住,我们可以通过在链上遍历的关系数量上进行排序,轻松地执行排序以选择最近的父节点或具有您的组权限的节点本身。更改了上面的查询以处理此问题。

现在,您的:权限通过objectID属性与:节点和:应用程序相关联,但对于使用图形关系的有效查询,可能应该将其建模为与对象本身的关系。此时的问题是accessLevel是否应存储在:Permission节点中,或者是否希望完全删除:Permission节点并使用带有accessLevel属性的:HasPermission关系对其进行建模

我假设您现在想保留:权限节点

假设:用户只能是一个:组的成员,则获取:节点或其:节点祖先的权限的查询类似于:

MATCH (:User{ID:123})-[:MEMBER_OF]->(group:Group), (node:Node{ID:123})
WITH group, node
// looking for a :Node going up the chain with a permission from your group
OPTIONAL MATCH (node)-[jumps:SUBTREE_OF*0..]->(target:Node)<-[:HasPermission]-(perm:Permission)<-[:WITH]-(group)
WITH node, target, perm, jumps
ORDER BY SIZE(jumps) LIMIT 1
RETURN target,  COALESCE(target = node, false) as same_node, COALESCE(perm.accessLevel, "WRITE") as accessLevel
返回包括我们最终在其上匹配的目标:节点,如果我们在层次结构中找不到该节点,则该节点将为null,并默认为写入访问级别,相同的\u节点表示我们要获取权限的:节点是否为具有权限的节点false表示我们找到了具有权限的祖先,还是默认的,accessLevel是关联权限的访问级别。您可能不需要所有这些,但是测试它是否正常工作是很有用的

编辑


记住,我们可以通过在链上遍历的关系数量上进行排序,轻松地执行排序以选择最近的父节点或具有您的组权限的节点本身。修改了上面的查询以处理此问题。

a:Permission的objectID引用的对象……与树结构中的:节点相同吗?如果:权限直接指向树结构中的节点,并且:权限只是:组的一部分,则有机会重构图形以简化查询。另外,是否:权限对象仅存储objectID和accessLevel,或者是否有其他字段?@InverseFalcon对象可以是:应用程序的和:节点的:应用程序是:节点的父节点,但为了简单起见,我决定省略它:权限只存储ObjectID和accessLevel。好的,有意义。是否可以保证,如果:节点没有来自:组的关联:权限,则它的:应用程序将具有该权限?或者:应用程序上面是否有其他节点类型应具有:权限?如果层次结构上的任何节点都不存在:权限,是否应该使用某种默认权限?:应用程序将由为每个:应用程序指定的强制权限处理,因此无需为它们及其子节点进行层次结构继承不
de将是第一个需要为其子对象继承的对象。默认权限应为WRITE,即。E所有权限。a:Permission的objectID引用的对象…与树结构中的:节点相同吗?如果:权限直接指向树结构中的节点,并且:权限只是:组的一部分,则有机会重构图形以简化查询。另外,是否:权限对象仅存储objectID和accessLevel,或者是否有其他字段?@InverseFalcon对象可以是:应用程序的和:节点的:应用程序是:节点的父节点,但为了简单起见,我决定省略它:权限只存储ObjectID和accessLevel。好的,有意义。是否可以保证,如果:节点没有来自:组的关联:权限,则它的:应用程序将具有该权限?或者:应用程序上面是否有其他节点类型应具有:权限?如果层次结构上的任何节点都不存在:权限,是否应该使用某种默认权限?:应用程序将由为每个:应用程序指定的强制权限处理,因此无需为它们及其子节点进行层次结构继承节点将是第一个需要为其子节点继承的对象。默认权限应为WRITE,即。E所有权限。我认为在一个单独的节点中访问级别也是必要的。我没有依赖于隐式排序,而是编辑了我的查询以强制执行排序,因此我们总是抓住链上具有您的组权限的第一个节点。@InverseFalcon更新的查询也适用于:User属于多个:group的情况。这就解决了我的问题,谢谢你抽出时间。谢谢。我用ID函数对查询进行了一点更新,使其适合我:我认为在单独的节点中访问级别也是必要的,我编辑了我的查询以强制执行排序,因此我们总是抓住链上具有您的组权限的第一个节点。@InverseFalcon当:User属于多个:组时,更新的查询也有效。这就解决了我的问题,谢谢你抽出时间。谢谢。我使用ID函数对查询进行了一点更新,使其适用于我: