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?
您能想到更清潔的解決方案嗎?
嗨,馬克,我測試了它和它的作品如預期(謝謝!)。雖然我對它的實際操作有點困惑。我還必須添加'skip_authorization_check:only =>:index'。這是否意味着我的資源根本沒有授權?那麼,索引怎麼沒有顯示所有的資源(即使是我沒有被授權的資源)呢? load_resource部分是否足夠聰明,無法加載? – karellm 2012-04-12 15:53:37
@kalema,'load_and_authorize_resource'只是加載追索(或收集),然後運行授權。所以如果你直接設置授權跳過,那麼只能執行加載。請參閱[文檔](https://github.com/ryanb/cancan/blob/master/lib/cancan/controller_additions.rb) – 2012-04-13 06:25:36