2010-08-10 90 views
2

我試圖使用declarative_authorization來保護Rails3控制器。聲明性授權filter_access_to

該控制器具有7,REST風格的動作,三個自定義成員的行爲(激活,停用副本),和一個自定義集合操作(​​公共)。然而,'公開'行動只返回一條記錄。

只有自定義集合操作(​​公共)應當提供給身份驗證的用戶;其餘部分僅適用於current_user。

has_permission_on :foos, :to => :public 
has_permission_on :foos, :to => [:full_control, :copy, :activate, :deactivate] do 
    if_attribute :user => is {user} 
end 

privilege :full_control, :includes => [:index, :show, :new, :create, :edit, :update, :destroy] 

4個的自定義動作在routes.rb中文件中定義:

resources :users do 
    resources :foos do 
    collection do 
     get :public 
    end 
    member do 
     post :activate, :copy, :deactivate 
    end 
    end 
end 

A用戶:的has_many FOOS; Foo:belongs_to用戶。

FoosController中定義的'標準'訪問控制(filter_resource_access:nested_in =>:user)似乎控制對7個RESTful操作的訪問,但無法控制對其他4個訪問(如預期的那樣)。

當我改變FooController的到:

filter_access_to :all, :nested_in => :users, :attribute_check => true 

我拿到寫着「無ID找不到富」的錯誤。

問題:

  1. 的文件似乎表明,一:的before_filter將自動被調用用於filter_access_to時加載富模型。我錯了嗎?我需要額外配置filter_access_to嗎?我是否需要手動配置:before_filter?
  2. 我是否還需要爲模型添加using_access_control以達到我的目的?當控制器中存在訪問控制時,需要將訪問控制添加到模型時,我有點不清楚。
  3. 該文檔描述了一個名爲'create'的特權 - 它被定義爲:privilege:create,:includes =>:new。另外,對於新行爲,這個特權是否會因爲其名稱而自動包含:create動作?
  4. 如果authentication_rules.rb文件改變時,這臺服務器需要重新啓動以應用新規則?
+1

你找到這些問題的答案嗎?我面臨類似的問題。 – Shreyas 2011-01-19 12:32:05

回答

0

我認爲自動過濾器之前,如果存在的話,是相當有限的。我一直都必須根據上下文編寫自己的過濾器。例如 - 對於索引視圖,除非模型的所有實例的權限相同,您需要有一個適合當前上下文的模型實例。與查看帖子索引的用戶一樣,您希望爲用戶製作一個虛擬新帖,或者先載入他們的第一個帖子,但由於第一個可能不存在,所以虛擬塊更安全。一般來說,我有一個索引的虛擬構造函數,其他所有東西都可以測試實際看到(或觸摸)的任何東西。

控制器已經夠用了,我到目前爲止,模型的水平肯定是不需要的。這並不是說它不會增加一些額外的安全性,但我不擅長什麼時候會變得重要。我假設這是當你有一個模型被許多控制器(例如無模控制器)所觸及,並且你想確保沒有偷偷摸摸的時候。

我沒有使用權限,所以我不知道,但我猜想,魔術繼承你描述不會發生。創建沒有特別要求的權限似乎是一個非常草率的方法。

不,不需要重新啓動 - 至少不在開發模式下。