资讯专栏INFORMATION COLUMN

Neo4j: RBAC权限管理简单图模型(实现概述)

Backache / 2204人阅读

摘要:建模权限管理系统对于操作角色和资源有条关系分别是如果对应的操作权限不存在表示没有权限这里为的资源有两条操作权限记录分别对应这样我们就可以定义具有某个角色的用户在指定的资源上拥有什么权限这种判断来达到控制用户对资源的访问节点关系创建创

建模RBAC权限管理系统


对于CRUD操作, 角色和资源有4条关系. 分别是CREATE,UPDATE,READ,DELETE. 如果对应的操作权限不存在, 表示没有权限.

这里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语句).

在Neo4j Browser中的效果

参考资料

RBAC权限管理模型

RBAC for a B2B Saas platform

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17684.html

相关文章

  • RBAC权限模型的初步理解

    摘要:近来部门接到一个外包项目,是基于现有的系统做一个知识文档库,类似于百度网盘一样的功能,只是在角色和权限上与网盘不同,这个项目我们部门称为,,难点就在于文件的权限管理。   近来部门接到一个外包项目,是基于现有的系统做一个知识文档库,类似于百度网盘一样的功能,只是在角色和权限上与网盘不同,这个项目我们部门称为KM,Knowledge Manager ,难点就在于文件的权限管理。   以下...

    2shou 评论0 收藏0
  • MySQL —— 简单聊一聊数据库设计

    摘要:数据库设计的三大范式确保每列的原子性如果每列都是不可再分的最小单元信息,则满足第一范式,比如下图中,地址是由国家和城市组成的,显然可以继续在拆分成两个列,国家和城市,是不满足第一范式的,需要将地址列差分成国家和城市两个列。 showImg(https://segmentfault.com/img/remote/1460000018997429?w=1100&h=546); 阅读原文 ...

    dingding199389 评论0 收藏0

发表评论

0条评论

Backache

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<