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

541991a · 发布于 2017年5月03日 · 最后由 541991a 回复于 2017年5月04日 · 979 次阅读
14281

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),我也将第一时间进行处理。

共收到 8 条回复
2329

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

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

不过我是:

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

https://github.com/yigexiangfa/the_role

15018

👍

14281
2329mingyuan0715 回复

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

2329
14281541991a 回复

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

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

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

rule编辑:

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

14281
2329mingyuan0715 回复

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

96

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

14281
32chen_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对象在定义权限时做额外判断。

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