项目地址: https://github.com/rails-engine/role_core
接上一弹 FormCore —— SaaS 快速开发套件之动态表单系统
通过 RoleCore 你可以快速的搭建 RBAC 系统,如图所示(参见项目的 Readme 在本地体验)
Dummy app 实现了多角色权限系统、集成 CanCanCan 并且包含了一套管理界面
RoleCore 的实现也非常简单,总代码量约 200 行,没有任何高深技巧
RBAC 最核心的要素就是角色,并且根据需要有多种可能性:单角色、多角色、角色可继承、角色应用在多种资源上(如组、用户) RoleCore 提供了最基本的 Role 模型的定义(以及数据迁移), 在此之上,只需要添加最基本的模型关联,就可以适应多种场景下的需要, 如:
Readme 中包含了对于单角色和多角色的集成说明
RoleCore 提供了一套类似 Rails 路由声明风格的 DSL(示例,灵感来自于 Redmine),
通过虚拟模型的手法,可以将权限转化成 Role 模型的 permissions 的虚拟关联模型并以序列化的方式持久化入数据库,
在使用时完全以面向对象显式调用方法的方式去检查权限,形如 role.permissions.project.create?
(具体使用方式参考 Gem 的 Readme)
并且,权限定义支持分组,分组支持嵌套。
此外还有 I18n 支持。
本质上,权限列表可以理解成散列表,键为权限名,值为布尔类型,表示是否拥有权限,于是,多角色和角色继承的最终权限集合可以转化成对散列表的操作,基于此原理,可以灵活多变的支持如角色继承等各种业务需要。
基于虚拟模型手法,权限会被转换成虚拟模型的字段,分组会转换成嵌套子模型(类似 Mongoid 的 embeds_one
),并且权限模型实现了 ActiveModel 接口,所以你可以在前台像一般的模型一样使用各种 Rails 提供好的 FormBuilder,后台也可以使用 StrongParameter 来过滤一些敏感的权限的设置。
Dummy app 中给出了一个例子,寥寥几行 便可实现截图中的权限列表表单。
对于前后端分离的项目,虽然不需要后端渲染方面的支持,但受益于 ActiveModel,可以很轻易的导出 Json,后端享受 StrongParameter 带来的安全性保障
RoleCore 本身 不 解决权限检查工作,基于上文所述检查权限方法,你可以利用 before_action
快速实现访问控制,并且,RoleCore 可以非常容易的和成熟的访问控制库(如 CanCanCan)进行集成。
访问控制作为系统的关键组件,由成熟的库来实现可以有效地降低风险,并且也减少了额外学习的成本。