Neo4j: RBAC許可權管理簡單圖模型

NO IMAGE

建模RBAC許可權管理系統

clipboard.png
clipboard.png

對於CRUD操作, 角色和資源有4條關係. 分別是CREATE,UPDATE,READ,DELETE. 如果對應的操作許可權不存在, 標識沒有許可權

這裡用ID為 c508b480-082e-11e8-9f0c-b8e8563f0d3a的用於有兩條操作許可權記錄. 這樣我們就可以定義具有某個角色的使用者在指定的資源上擁有什麼許可權這種判斷, 來達到控制使用者對資源的訪問.

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語句).

clipboard.png

在Neo4j Browser中的效果

clipboard.png

參考資料