以下是我的能力档案。
在大多数控制器中,如果我想应用cancan,我只需要将load_and_authorize_resource
放在控制器的开头。
如果我想创建一个名为ABC的特定控制器,并且不允许用户运行索引操作(即show),该怎么办?
有什么想法吗?
class Ability
include CanCan::Ability
def basic_read_only
can :read, :all
can :list, :all
can :search, :all
end
def basic_operation
can :read, :all
can :list, :all
# can :edit, :all
can :create, :all
can :search, :all
end
def initialize(user)
if user.blank?
# user.role == 'guest'
cannot :manage, :all
basic_read_only
else
if 'admin' == user.role
can :manage, :all
else
# cannot :manage, :all
# basic_read_only
basic_operation
end
end
end
end
答案 0 :(得分:0)
您可以使用check_authorization确保授权特定于操作级别。
class ApplicationController < ActionController::Base
check_authorization
end
如果你没有授权用户X(通过ability.rb)在你的控制器上执行动作索引,它应该可以工作。
另一个选项只包括索引资源中的自动化:
class UsersController < ActionController::Base
def index
@products = Product.all
authorize! :read, @products
end
end
顺便说一句,在开发时,CanCan Ryan使用:read as an alias for both actions :show and :index(... alias_action:index,:show,:to =&gt;:read)。
答案 1 :(得分:0)
你可以将params传递给load_and_authorize_resource,例如:
load_and_authorize_resource :only => [:index, :show]
如果您只想拒绝ABC类的索引和显示
can :manage, ABC
cannot :read, ABC
我真的建议你阅读维基很清楚https://github.com/ryanb/cancan/wiki/