1

下面是我的能力文件。

在大多数控制器中,如果我想应用cancan,我只需要将load_and_authorize_resource控制器放在开头即可。

如果我想制作一个名为 ABC 的特定控制器,并且不允许用户运行索引操作(即显示)怎么办?

有任何想法吗?

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   
4

2 回答 2

0

您可以将参数传递给 load_and_authorize_resource,例如:

load_and_authorize_resource :only => [:index, :show]

如果您只想拒绝 ABC 类的索引和显示

can :manage, ABC
cannot :read, ABC

我真的建议您阅读 wiki,它非常清楚https://github.com/ryanb/cancan/wiki/

于 2013-10-18T07:04:53.170 回答
0

您可以使用check_authorization确保授权特定于操作级别。

~ ... application_controler.rb

class ApplicationController < ActionController::Base
  check_authorization
end

如果您没有授权用户 X(通过能力.rb)在您的控制器上执行操作索引,它应该可以工作。

另一种选择是仅在索引资源中包含自动化:

~ ... products_controler.rb

class UsersController < ActionController::Base

 def index
   @products = Product.all
   authorize! :read, @products
 end
end

顺便说一句,在开发 CanCan Ryan 时,使用:read 作为 :show 和 :index 动作的别名(...alias_action :index, :show, :to => :read)。

于 2013-10-18T03:54:30.853 回答