我现在使用rspec,设计和cancan。说实话,我发现cancan非常混乱,我在拾取和有效使用它时遇到了很多困难。文档不是很深入,这让我很难调试(查看我过去的问题)。
CanCan是否有替代品可以在我使用的其他工具中轻松整合?
答案 0 :(得分:35)
截至2014年初, Pundit 是CanCan(以及后继者CanCanCan)的热门替代品。 Pundit将每个控制器与策略对象匹配。与CanCan不同,所有访问控制都没有中央规则文件。它比CanCan简单。 RailsApps项目中有一个示例应用程序:
<强> Rails Pundit Example 强>
我还在Rails Authorization with Pundit上写了一个教程。
另一种选择是来自Nathan Long的 Authority gem 。所有规则逻辑都在称为“授权者”的Ruby类中,与模型相关联。
答案 1 :(得分:7)
有些人正在继续开发康康舞。看看:
答案 2 :(得分:4)
出于同样的原因,我已经这样做了:http://mcasimir.github.com/checkin/。
Checkin 是一个授权gem,它独立于您使用的角色/身份验证库。
您甚至可以使用声明/级联权限DSL来表达复杂的规则。
我发现它非常方便。调试也通过explain
方法支持,该方法将在每次请求时记录授权过程。
以下是一些功能:
这是一个非常简单的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可能会变得强大。它有一种不那么“神奇”,更直接的方法。
答案 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