开源项目 Fibman - 全新的权限管理 Gem

541991a · 2017年05月03日 · 最后由 yqwoe 回复于 2017年09月12日 · 9110 次阅读

Fibman - 全新的权限管理 Gem

长期以来,在 Rails 项目中权限管理使用cancan已成为大多数场景下的最佳实践。从我个人经历来说,无论是个人还是公司的项目都不例外。

最近,公司进行业务升级,权限管理的方式也需要改动,从过去的基于固定角色定义改变为基于动态角色定义,并需要开放给相关用户进行自定义的权限设定。而在权限管理的维度上,现阶段产品也并不能给出最终的确定方案。

当这样一个业务需求排上来的时候,经过分析,支撑业务所需要的权限系统需要满足以下几点功能:

  • 多维度的权限收集和定义 (开放权限管理范围)
  • 目标对象的权限持久化 (自定义权限)
  • 权限控制

cancan对于以上几点能给出的解决方案,有,但是太繁琐。所以,开发一套摒弃cancan并能够满足以上功能的新权限管理模块的想法便产生了。

(依然要向 cancan 致敬,开发中也有部分参考 cancan 的设计)

设计思想

既然要开发全新的权限系统,就要创造一些新的特性。

摆脱 Rails 束缚

不基于 Rails 进行设计,最终的权限控制通过模块注入的方式对 Rails 或其他框架进行适配。

权限模块实例化

在一个系统中,可定义多个权限模块并各自收集管理权限,互相完全独立。可以解决同项目多系统的权限管理问题。

权限维度多样化

可以定义上述三种类型的权限并打包为权限集

  • url 设定访问请求 url 的权限
  • action MVC 架构中,设定访问 controller action 权限。
  • key 设定自定义 key 作为权限载体

持久化

使用 Redis 保存自定义权限

源码及安装使用

Github - Fibman

补充

现阶段为了尽快满足项目需求,还没有加入测试代码,也可能会存在特定场景下功能不完善的情况,所以不建议使用到生产环境或者重要项目中,希望大家有机会试用并提出各种意见,或者 Fork 之后增强功能 (Fix Bug),我也将第一时间进行处理。

我也写过这样一个 rails engine,实现了:

  • action MVC 架构中,设定访问 controller action 权限。
  • key 设定自定义 key 作为权限载体

不过我是:

  • 有一个 UI 界面,可以根据路由自动获取 controller/action 信息;
  • 把数据存在数据库中,然后用了 Rails.cache 做的缓存。

https://github.com/yigexiangfa/the_role

mingyuan0715 回复

👍 确实遇到了相似的场景。设计时也考虑过 根据路由自动获取controller/action信息。最终还是感觉能够通过权限收集,把多个 action 组装成意义更明确的权限集用来开放管理,更符合当前的业务场景,也有灵活性,就是比较费事,每次加入新的功能都需要定义对应 action 的权限所属。

541991a 回复

我自动获取的 action 信息 存到一个表里,然后是可以编辑的,也可以删除和再增量自动获取。

  • 也可以支持多个 action 组合的,rule 记录成 [action1, action2]
  • 也支持参数列表。

section/action 列表。section 对应 controller,rule 对应 action

rule 编辑:

可以做到增加 actions/controller 后不用改一行代码,在 ui 里配置下就行了。

mingyuan0715 回复

👍 ,你这个方案不错,不用写代码配置了。

不用写代码配置 很难做到。这样只能简单的做到 直接把所有的 action 都禁掉。但其实 我们做权限重要的是要对用户和数据进行权限判断,比如 A 可以访问 项目 A 但是 访问不了项目 B。大家有没什么好的办法对数据 用户 进行关联的权限判断?

chen_rb 回复

对于资源的限制方面cancan做的比较好,我在这个方面实现就比较简单:

add :permission1, "Permission1" do
    def_action DemoController, :show do |user, request|
      # 扩展权限验证,额外进行权限判断
      user.demo.id == request.params[:id]
    end

    def_url "demo/list" do |user, request|
      # True or False
    end
end

用 proc 提供自定义验证,提供当前用户和 request 对象在定义权限时做额外判断。

541991a 回复

可以试试加入规则引擎,ruleby,wongi-engine

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