我目前正在使用rspec、devise和cancan。老实说,我发现cancan非常令人困惑,并且在学习和有效使用它方面遇到了很多困难。文档不够详细,这让我难以调试(请查看我的过去问题)。
是否有可以替代Cancan并且容易集成到我正在使用的其他工具中的选择?
我目前正在使用rspec、devise和cancan。老实说,我发现cancan非常令人困惑,并且在学习和有效使用它方面遇到了很多困难。文档不够详细,这让我难以调试(请查看我的过去问题)。
是否有可以替代Cancan并且容易集成到我正在使用的其他工具中的选择?
我还写了一个关于Rails Authorization with Pundit的教程。
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)
很抱歉我说话太啰嗦了。
我发现https://github.com/stffn/declarative_authorization非常完整,而且它的使用也很符合逻辑。
你可能也想要查看这个“超轻量级授权库” - six
six-rails
。 - Matheus Moreira我建议使用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
,因此只有在当前用户被授权访问ArticlesController
中的edit
操作时,链接才会显示。它还支持命名空间。
它允许默认锁定控制器,自定义重定向路径和警报消息等。请查看文档获取更多信息。
authority-gem
的SO问题。 - Nathan Long