2012-04-11 52 views
1

我的權限在數據庫中定義,如CanCan wiki所述。我想授權:index僅用於我的權限表中的id,但如果沒有授權資源,仍然顯示索引頁。CanCan能力通過數據庫和load_resource

如果我使用load_and_authorize_resource,它會根據權限加載資源。如果我沒有,則無法訪問index操作。我在資源上獲得拒絕訪問權限。

如果我還是要允許訪問:index行動沒有授權的資源,我看到兩個選項:

選項1(討厭) :手動加載的資源索引。

class FirmsController < ApplicationController 
    load_and_authorize_resource :except => :index 

    def index 
    @firms = user.permissions.where{action: ["index", "manage", "read"], subject_class: "Firm"} 
    end 
end 

選項2(MEH):添加了一個功能:指數與ID的約束:[](無),然後再用我的數據庫權限覆蓋它。

class Ability 
    include CanCan::Ability 

    def initialize(user) 

    user ||= User.new # guest user (not logged in) 

    can :create, Firm 
    can :index, Firm, id: [] 

    user.permissions.each do |permission| 
     if permission.subject_id.nil? 
     can permission.action.to_sym, permission.subject_class.constantize 
     else 
     can permission.action.to_sym, permission.subject_class.constantize, :id => permission.subject_id 
     end 
    end 

    end 
end 

選項3?

您能想到更清潔的解決方案嗎?

回答

1

正如docs你應該使用的輔助方法說明:

skip_authorize_resource :only => :index 
+0

嗨,馬克,我測試了它和它的作品如預期(謝謝!)。雖然我對它的實際操作有點困惑。我還必須添加'skip_authorization_check:only =>:index'。這是否意味着我的資源根本沒有授權?那麼,索引怎麼沒有顯示所有的資源(即使是我沒有被授權的資源)呢? load_resource部分是否足夠聰明,無法加載? – karellm 2012-04-12 15:53:37

+0

@kalema,'load_and_authorize_resource'只是加載追索(或收集),然後運行授權。所以如果你直接設置授權跳過,那麼只能執行加載。請參閱[文檔](https://github.com/ryanb/cancan/blob/master/lib/cancan/controller_additions.rb) – 2012-04-13 06:25:36