Neo4J多租户和基于角色的节点访问

时间:2017-06-07 09:58:02

标签: neo4j cypher

我正在尝试为Neo4j定义用户管理和权限模型。我有一个Web应用程序(Angular 2)通过API(KOANEO4J)连接到Neo4j。 Neo4j是应用程序使用的唯一数据库或持久存储。通过该应用程序,用户可以通过运行Cypher语句来添加/编辑/删除使用API​​在Neo4j中执行这些指令的内容。到目前为止,我并不担心支持多个用户,但作为下一步,我开始考虑这个问题。

该产品将由多家不同公司使用,每家公司将拥有多个用户,因此我需要一些方法来支持这一点。我在Neo4J中考虑的模型如下:

“Orgaization”由一个节点表示,它可以有一个或多个“组织目录”。属于该目录的所有节点都将是其中一个“组织目录”的子节点。

enter image description here

每个用户也将由数据库中的节点表示。他们将属于一个组织。他们将对由边缘标识的组织目录具有某些访问权限。

enter image description here

  1. 我正在寻找一些关于这是否是一个合适的模型的建议,或者是否有任何示例或文档描述如何在Neo4j中实现这一点。
  2. 如果我确实实现了此模型,那么最好将权限建模为单独的节点,以便用户连接到权限节点(例如,只读访问权限),然后连接到组织目录。
  3. 关于如何让API实际使用此类模型的任何建议。我确信我可以将用户ID作为每个查询的一部分传递给Neo4j,然后过滤结果以仅显示用户可以访问的节点,但这似乎不是一个非常优雅的解决方案 - 它也意味着所有的安全性将取决于仔细编写的Cypher查询,这些查询不会泄漏用户不应该访问的数据。
  4. 非常感谢

1 个答案:

答案 0 :(得分:1)

  

我正在寻找一些关于这是否合适的建议   要遵循的模型,或者是否有任何示例或文档   描述如何在Neo4j中实现这一点。

这个问题的答案是:它取决于。请记住,在对图形数据库建模时,应考虑向数据库提出的查询。如果此模型适合您向数据库询问的查询,那么此模型是合适的,否则不是。请参阅图书数据库一书的第5章(现实世界中的图表)(由Ian Robison,Jim Webber和Emil Eifrem撰写。可供下载here)。本章介绍了Neo4j中授权和访问控制系统的建模过程。可以启发并对您有所帮助。

  

如果我确实实施了这个模型,那么建模它会更好   权限作为单独的节点,以便用户连接到权限   节点(例如,只读访问)然后连接到   组织目录。

再次,这取决于。如果Permission实体与用户和组织目录之外的应用程序的其他实体有连接,请执行此操作。否则,我相信您的权限可以建模为用户和组织目录之间的关系。

  

有关如何让API真正使用此功能的任何建议   型号的类型。我确信我可以将用户ID传递给Neo4j作为其中一部分   每个查询然后过滤结果以仅显示用户拥有的节点   访问但这似乎不是一个非常优雅的解决方案 - 它也   意味着所有的安全性都取决于仔细编写   Cypher查询不泄漏用户不应该泄露的数据   访问。

在AngularJS客户端应用程序和Neo4j数据库之间添加另一层软件也许是一个好主意。这种方式在这个新的软件层(例如Node.js应用程序)中,您可以实现访问控制系统,然后验证经过身份验证的用户是否可以访问所请求的资源。