对于CRUD操做, 角色和资源有4条关系. 分别是CREATE
,UPDATE
,READ
,DELETE
. 若是对应的操做权限不存在, 表示没有权限.segmentfault
这里ID为 c508b480-082e-11e8-9f0c-b8e8563f0d3a
的资源有两条操做权限记录(分别对应READ, CREATE). 这样咱们就能够定义具备某个角色的用户在指定的资源上拥有什么权限这种判断, 来达到控制用户对资源的访问.运维
// 建立角色(管理员,运维,普通用户) CREATE (:Role {name: "Operator"}),(:Role {name: "Admin"}),(:Role {name: "User"}); // 建立资源节点 CREATE (resource:Resource {path: "/", name: "根目录"}) RETURN resource; // 普通用户在资源 / 上有, READ, CREATE权限 MATCH (role:Role {name: "User"}), (resource:Resource {path: "/"}) CREATE (role)-[op:READ {created_at: timestamp()}]->(resource); MATCH (role:Role {name: "User"}), (resource:Resource {path: "/"}) CREATE (role)-[op:CREATE {created_at: timestamp()}]->(resource); // 查询一个用户在某个资源山的操做权限列表 MATCH (u:User {name: "测试用户"})-[r:HAS_ROLE]->(role:Role {name: "User"})-[op]->(resource) WHERE u.roleId = role.uuid RETURN u.name,op.name, resource.path;
在实际的查询须要把用户(u
), 角色(r
), 资源(s
)参数化. 咱们用一个函数来表达函数
$$P = f(u, r, s)$$测试
P
为具备某个角色(r
)的用户(u
)在资源s
上的权限集合.
// 权限查询 MATCH (u:User) -[:HAS_ROLE]->(r:Role {name: "User"}) -[op]->(resource:Resource {path: "/"}) RETURN u.uuid as user_id, r.name as role_name, resource.path as resource_path, type(op) as operation;
在IDEA中的Neo4j插件, 支持单一语句执行(在.cypher
文件中能够保持多条Cypher查询语句, 点击一条语句会有绿色的框, 而后在点击执行按钮会执行这条被选中的Cypher语句).ui
在Neo4j Browser中的效果spa