2011-03-22 76 views
3

我有一個CanCan模型的3級嵌套與繼承的資源相結合的問題。我讀過,我們應該巢一切長達2級水平,但我不得不把一切都在account模型,現在我已經在康康舞試着這樣做:繼承的資源和CanCan 3級嵌套

load_and_authorize_resource :account 
load_and_authorize_resource :project, :through => :account 
load_and_authorize_resource :model, :through => :project 

這給了我,有一個@account變量@project的值,就像它覆蓋那個一樣。 @project也是應該和@model。我的這個錯誤,CanCan的,繼承的資源還是CanCan不支持3層嵌套?另外,我在ModelsController的IR中執行此操作。

belongs_to :account, :finder => :find_by_name! do 
    belongs_to :project, :finder => :find_by_name! 
end 

另一個奇怪的事情是,當我從康康舞的定義中刪除了部分load_and_。它的工作原理是這樣的,但我讀過,不使用load部件可能會很危險。

我可以只使用authorize_resource還是應該使用CanCan做些什麼?

+2

我不知道CanCan支持多少級別,但是你可以自己加載,然後調用'authorize_resource'方法。 https://github.com/ryanb/cancan/wiki/Authorizing-Controller-Actions – jdl 2011-03-22 18:02:54

+0

您可以使用authorize_resource,只需確保在authorize_resource之前使用before_filter進行加載。 – dombesz 2011-03-23 11:39:49

回答

2

就我所能說的,您的授權是正確的。

的康康舞寶石瑞安張貼了這個應該如何表現的開發商:https://github.com/ryanb/cancan/issues/127#issuecomment-364475

這意味着,你

load_and_authorize_resource :account 
load_and_authorize_resource :project, :through => :account 
load_and_authorize_resource :model, :through => :project 

將在這樣的(這裏是塊結束:創建操作對於其他行動應該是最後一個授權!和@model更改):

@account = Account.find(params[:account_id]) 
authorize! :read, @account 
@project = @account.projects.find(params[:project_id]) 
authorize! :read, @project 
@model = @project.models.build 
authorize! :new, @model 

我希望這個答案可以幫助開發人員尋找嵌套的cancan授權:-)。

來源:https://github.com/ryanb/cancan/issues/127#issuecomment-364475


PS:錯誤的行爲/賬戶/ 1 /項目/ 2 /模型/新:

load_and_authorize_resource :project 
load_and_authorize_resource :model, :through => :project 

這是怎樣的一個安全問題,因爲這將做

@project = Project.find(PARAMS [:PROJECT_ID]) [...]

,並且不檢查當前賬戶是否被允許讀取鏈接賬戶'1'。 而且它不檢查項目'2'是否真的是賬戶'1'的項目。