使用CanCan on Rails 3禁止用户在特定控制器中运行索引操作

时间:2013-10-18 03:40:16

标签: ruby-on-rails ruby-on-rails-3 cancan

以下是我的能力档案。

在大多数控制器中,如果我想应用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   

2 个答案:

答案 0 :(得分:0)

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

〜... application_controler.rb

class ApplicationController < ActionController::Base
  check_authorization
end

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

另一个选项只包括索引资源中的自动化:

〜... products_controler.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/