CanCan的替代品?

时间:2011-08-27 10:23:36

标签: ruby-on-rails

我现在使用rspec,设计和cancan。说实话,我发现cancan非常混乱,我在拾取和有效使用它时遇到了很多困难。文档不是很深入,这让我很难调试(查看我过去的问题)。

CanCan是否有替代品可以在我使用的其他工具中轻松整合?

11 个答案:

答案 0 :(得分:35)

截至2014年初, Pundit 是CanCan(以及后继者CanCanCan)的热门替代品。 Pundit将每个控制器与策略对象匹配。与CanCan不同,所有访问控制都没有中央规则文件。它比CanCan简单。 RailsApps项目中有一个示例应用程序:

  

<强> Rails Pundit Example

我还在Rails Authorization with Pundit上写了一个教程。

另一种选择是来自Nathan Long的 Authority gem 。所有规则逻辑都在称为“授权者”的Ruby类中,与模型相关联。

答案 1 :(得分:7)

有些人正在继续开发康康舞。看看:

https://github.com/CanCanCommunity/cancancan

答案 2 :(得分:4)

出于同样的原因,我已经这样做了:http://mcasimir.github.com/checkin/

Checkin 是一个授权gem,它独立于您使用的角色/身份验证库。

您甚至可以使用声明/级联权限DSL来表达复杂的规则。

我发现它非常方便。调试也通过explain方法支持,该方法将在每次请求时记录授权过程。

以下是一些功能:

  • 使用声明式方法定义角色和权限的方便DSL
  • 自动检查CRUD操作的授权
  • 从授权错误中拯救的标准方法
  • 授权主题与模型分离(与任何身份验证系统兼容)
  • 基于角色的授权与角色系统分离(与任何角色兼容) 系统)
  • 用于current_user和其他主题对象的装饰器
  • 范围内的授权规则
  • 级联授权规则
  • 简单:即使是复杂的授权行为也是可以理解的 容易预测
  • 支持基于控制器的质量分配保护

这是一个非常简单的DSL示例:

class UserSubject < Checkin::Subject

      role :guest, :alias => :anonymous do
          !subject_model
      end

      role :logged_in, :alias => [:connected] do
          !!subject_model
      end

      role :owner, :require => [:logged_in], :method => :own do |object|
          object && ( object.respond_to?(:author) && ( subject_model == object.author ) ) ||  ( object.respond_to?(:owner) && ( subject_model == object.owner ) )
      end

      role :administrator, :require => :logged_in, :alias => :admin do
          subject_model.has_role?(:administrator)
      end

      #
      # Permissions
      #

      permissions :for => :comments do
        allow :administrators
        allow :logged_in, :to => [:create]
        deny
      end

      # Admin

      scope :admin do
        permissions do
          allow :administrators
          allow :owners,  :to => [:edit, :update]
          deny
        end
      end

end

检查角色和权限:

subject = UserSubject.new(User.first, :scope => :admin)
subject.logged_in?
subject.guest?
subject.own?(Post.first)
subject.can_edit?(Post.first)

我为这么罗嗦道歉。

答案 3 :(得分:3)

我发现https://github.com/stffn/declarative_authorization相当完整。使用它是合乎逻辑的。

答案 4 :(得分:3)

听起来像Pundit可能会变得强大。它有一种不那么“神奇”,更直接的方法。

https://github.com/elabs/pundit

答案 5 :(得分:2)

我正在探索Heimdallr。它具有的一个特点是,大多数这些cancan替代方案都不是索引操作的限制范围。

答案 6 :(得分:1)

您也可以查看这个“超精简授权库” - six

答案 7 :(得分:1)

检查TheRole gem。康康的非常有趣的替代品

答案 8 :(得分:1)

这是另一种选择: StrongBolt

https://github.com/AnalyticsMediaGroup/strongbolt

开发人员有一篇很好的文章检查选项并解释他们的方法:

https://www.amg.tv/blog/strongbolt-why-and-how-we-built-our-own-rails-authorization-framework

他们的方法已被证明对我的应用来说是完美的,因为它还包括“租户”的想法。或多个垂直分组用户。

核心开发人员之前曾在另一个名为Grant的框架上工作。

答案 9 :(得分:0)

我推荐Action Access,它更简单直接,与Rails无缝集成,而且非常轻巧。归结为:

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以获取更多信息。

答案 10 :(得分:0)

还有Consul

使用只返回用户有权访问的对象的方法创建Power类,而不是加载对象并检查对象的权限。 Talk by the author