Neo4j: RBAC權限管理簡單圖模型(實現概述)

建模RBAC權限管理系統

clipboard.png
clipboard.png

對於CRUD操做, 角色和資源有4條關係. 分別是CREATE,UPDATE,READ,DELETE. 若是對應的操做權限不存在, 表示沒有權限.segmentfault

這裏ID爲 c508b480-082e-11e8-9f0c-b8e8563f0d3a的資源有兩條操做權限記錄(分別對應READ, CREATE). 這樣咱們就能夠定義具備某個角色的用戶在指定的資源上擁有什麼權限這種判斷, 來達到控制用戶對資源的訪問.運維

Cypher 節點關係建立

// 建立角色(管理員,運維,普通用戶)
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上的權限集合.

Cypher 查詢語句

// 權限查詢
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

clipboard.png

在Neo4j Browser中的效果spa

clipboard.png

參考資料

相關文章
相關標籤/搜索