對於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