Gem RoleCore —— SaaS 快速开发套件之快速搭建 RBAC 系统

jasl · 2018年04月25日 · 最后由 canonpd 回复于 2019年09月20日 · 7114 次阅读

项目地址: https://github.com/rails-engine/role_core

接上一弹 FormCore —— SaaS 快速开发套件之动态表单系统

通过 RoleCore 你可以快速的搭建 RBAC 系统,如图所示(参见项目的 Readme 在本地体验)

Dummy app 实现了多角色权限系统、集成 CanCanCan 并且包含了一套管理界面

RoleCore 的实现也非常简单,总代码量约 200 行,没有任何高深技巧

RoleCore 解决了什么问题

角色模型

RBAC 最核心的要素就是角色,并且根据需要有多种可能性:单角色、多角色、角色可继承、角色应用在多种资源上(如组、用户) RoleCore 提供了最基本的 Role 模型的定义(以及数据迁移), 在此之上,只需要添加最基本的模型关联,就可以适应多种场景下的需要, 如:

  • 单角色系统:增加角色到用户的一对多关联
  • 多角色系统:增加角色到用户的多对多关联
  • 角色可继承:增加角色的自关联
  • 角色可作用在多种资源:为角色增加多态关联

Readme 中包含了对于单角色和多角色的集成说明

权限定义

RoleCore 提供了一套类似 Rails 路由声明风格的 DSL(示例,灵感来自于 Redmine), 通过虚拟模型的手法,可以将权限转化成 Role 模型的 permissions 的虚拟关联模型并以序列化的方式持久化入数据库, 在使用时完全以面向对象显式调用方法的方式去检查权限,形如 role.permissions.project.create?(具体使用方式参考 Gem 的 Readme)

并且,权限定义支持分组,分组支持嵌套。

此外还有 I18n 支持。

本质上,权限列表可以理解成散列表,键为权限名,值为布尔类型,表示是否拥有权限,于是,多角色和角色继承的最终权限集合可以转化成对散列表的操作,基于此原理,可以灵活多变的支持如角色继承等各种业务需要。

管理 UI

基于虚拟模型手法,权限会被转换成虚拟模型的字段,分组会转换成嵌套子模型(类似 Mongoid 的 embeds_one),并且权限模型实现了 ActiveModel 接口,所以你可以在前台像一般的模型一样使用各种 Rails 提供好的 FormBuilder,后台也可以使用 StrongParameter 来过滤一些敏感的权限的设置。

Dummy app 中给出了一个例子,寥寥几行 便可实现截图中的权限列表表单。

对于前后端分离的项目,虽然不需要后端渲染方面的支持,但受益于 ActiveModel,可以很轻易的导出 Json,后端享受 StrongParameter 带来的安全性保障

权限检查

RoleCore 本身 解决权限检查工作,基于上文所述检查权限方法,你可以利用 before_action 快速实现访问控制,并且,RoleCore 可以非常容易的和成熟的访问控制库(如 CanCanCan)进行集成。

访问控制作为系统的关键组件,由成熟的库来实现可以有效地降低风险,并且也减少了额外学习的成本。

赞大佬!~

jasl RBAC 细颗粒度权限分配,有好的解决方案吗? 提及了此话题。 05月23日 18:28
jasl 反模式之虚拟模型模式及其应用 提及了此话题。 06月20日 17:18
jasl WorkflowCore —— SaaS 快速开发套件之工作流引擎 提及了此话题。 09月27日 08:42
7 楼 已删除

这么好的项目,我好不容易遇到。 自己折腾了好几天 cancancan + rolify,想尽办法用数据库来管理权限,所有思路都已经整理清楚,正要开工。 突然发现了这个项目,这下舒服了,bundle install。。。。收工 给楼主点 10000 个赞!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号