精华 如何实现细粒度的访问控制
发布于 5 年前 作者 graphway 3893 次浏览 来自 分享

Neo4j提供4种数据库级别的用户角色:Reader, Publisher, Architect和Administrator。在3.4版本以后还允许定义节点属性级别的访问控制。但是,有时候还需要能够按照标签、或者关系类型、或者属性值进行访问控制。这时,可以通过服务器端的扩展过程来实现。

基本思路是定义新用户,该用户拥有的只有运行某些扩展过程的权限,在扩展过程中限制对特定标签、关系类型的访问。

1、定义用户和角色 // 创建一个只能访问Movie节点的角色 CALL dbms.security.createRole(“movies_only”) // 创建一个新用户lockedDown CALL dbms.security.createUser(“lockedDown”, “abc”, false) // 新用户只有一个角色。目前没有任何数据库权限。 CALL dbms.security.addRoleToUser(“movies_only”, “lockedDown”)

2、在neo4j.conf中为新角色指定可执行的过程, training.moviesOnly是新过程名 dbms.security.procedures.roles=training.moviesOnly:movies_only;

3、使用JAVA实现扩展过程training.MoviesOnly

@Context public GraphDatabaseService db;

@Description( “Find movies by an actor” ) @Procedure( name = “training.moviesOnly”, allowed = “movies_only”, mode = Mode.READ ) public Stream<Movie> moviesOnly( @Name( “name” ) String name ) throws InvalidArgumentsException, IOException { String query = “MATCH (:Person {name: {name}})-[:ACTED_IN]->(movie) RETURN movie”; return db.execute( query, map(“name”, name) ) .stream() .map( Movie::new ); }

编译上述类,将生成的JAR复制到NEO4J_HOME/plugins目录下,重新启动Neo4j即可。这时,用户lockedDown只能执行training.moviesOnly方法来查询数据库: // 用lockedDown用户名和abc密码登录Neo4j CALL training.moviesOnly(“Halle Berry”)

注释】 在Neo4j 3.3以后,过程的访问权限在neo4j.conf里面设置、不用在过程里面指定allowed参数了。例子如下: dbms.security.procedures.roles=package.procedure1:roleName1,roleName2; package.procedure2:roleName1

在线参考:https://neo4j.com/docs/operations-manual/3.5/authentication-authorization/subgraph-access-control/

1 回复

非常好,感谢大佬了。

回到顶部