Rails 4授权gem

时间:2013-11-30 10:54:29

标签: ruby-on-rails-4 authorization

我正在寻找rails 4的授权宝石。 在我使用cancan之前,它现在看起来已经过时了......

我在这里找到了the_role https://github.com/the-teacher/the_role 这几乎是我想要的,但有一些恼人的问题。也许存在类似的宝石?我需要角色,在数据库中存储角色以及在规则中存储关联操作。如果宝石与bootstrap配合,它会很棒。

P.S。对于身份验证,我使用设计。

5 个答案:

答案 0 :(得分:30)

<强> CanCanCan

CanCan是由Ryan Bates(最着名的RailsCasts)开发并在Rails 4.0发布之前放弃授权的流行宝石。由于受欢迎,基于社区的CanCanCan项目维护着CanCan的更新版本。 CanCan提供了一种DSL(特定于域的语言),可以在一个Ability类中隔离所有授权逻辑。

<强>权威人士

Pundit gem越来越受Rails授权的欢迎。 Pundit是一个授权系统,它使用简单的Ruby对象来访问规则。 Pundit使用名为 app / policies / 的文件夹,其中包含实现访问规则的纯Ruby对象。

CanCanCan或Pundit或?

随着应用程序的复杂性增加,CanCan Ability类可能变得笨拙。此外,每个授权请求都需要评估完整的CanCan Ability类,从而增加了性能开销。 Pundit还提供了将访问规则分隔到中心位置的优势,使控制器保持紧凑。 Pundit策略对象是轻量级的,添加授权逻辑而没有CanCan那样多的开销。

简单的基于角色的授权

使用Rails 4.1,您可以使用Active Record Enum实现基于角色的授权。如果您的访问规则很复杂,您可以使用CanCanCan或Pundit保持控制器瘦,但是对于简单的要求,您可能不需要CanCanCan或Pundit。

我写了一篇关于 Rails Authorization 的文章,详细介绍了CanCanCan和Pundit以及简单的基于角色的授权。

答案 1 :(得分:4)

即使在Ruby之外,您也应该考虑更大的图景并考虑授权模型。传统的普遍模型是基于角色的访问控制(RBAC),这是大多数框架和 - 在Ruby中 - 大多数宝石实现的。

但是,如果您有更多高级方案,则需要考虑基于属性的访问控制和XACML,即可扩展访问控制标记语言。

使用XACML,您可以实现基于策略的上下文感知授权。例如,您可以编写如下规则:

  • 经理可以编辑他们拥有的文件
  • 医生可以查看他们被分配到的病人的病历

等等......

我不知道任何Ruby gem将XACML应用于您的Ruby项目,但XACML的本质是您可以轻松实现自己的授权代理(执行点)。我用PHP,Java,.NET和Perl编写了一些文章。

您需要一个授权引擎。有一些开源和供应商解决方案,如SunXACML和Axiomatics。

以下是一些有趣的资源:

答案 2 :(得分:3)

Cancancan是罐头的新版本:

https://github.com/CanCanCommunity/cancancan

答案 3 :(得分:2)

Action Access适用于Rails 4,语法非常清晰,而且非常轻量级。

归结为:

class ArticlesController < ApplicationController
  let :admin, :all
  let :user, [:index, :show]

  # ...
end

这将自动锁定控制器,允许管理员访问每个操作,用户仅显示或索引文章,其他任何人都将被拒绝并通过警报重定向。

与控制器相关的一切都在控制器内,使其真正模块化,避免在重构时留下被遗忘的垃圾。

对于粒度控制,您可以使用not_authorized!内部操作来检查数据库中的数据或您需要的任何内容。

它完全独立身份验证系统,即使没有User模型或预定义角色,它也可以正常工作。您所需要的只是设置当前请求的许可级别:

class ApplicationController < ActionController::Base
  def current_clearance_level
    session[:role] || :guest
  end
end

您可以返回应用所需的任何内容,例如current_user.role

它还捆绑了一组方便的模型添加,允许扩展用户模型并执行以下操作:

<% if current_user.can? :edit, :article %>
  <%= link_to 'Edit article', edit_article_path(@article) %>
<% end %>

此处:article引用ArticlesController,因此只有当前用户有权访问edit中的ArticlesController操作时,才会显示该链接。 命名空间也受支持。

您可以默认锁定控制器,自定义重定向路径和警报消息等。查看documentation以获取更多信息。

答案 4 :(得分:0)

Pundit和Cancancan是用于导轨4的最佳宝石