2009-07-20 16 views
1

我有我的數據庫中的一些記錄,其中只有擁有用戶或管理員可以查看/編輯等如何在Rails中最好地保護記錄?

什麼是對一個應用程度地確保這些記錄,因此只有這些人可以看到這些的最佳途徑記錄?我可以用條件手動執行此操作,但我需要確保在每個find()中使用相同的條件。

任何想法?

回答

3

劃定範圍的取景器爲CURRENT_USER是在大多數情況下是有用提供的類型用戶的CURRENT_USER變量,但不會不考慮用戶是管理員並且有權訪問它不直接關聯的對象。

在模型中創建一個命名作用域,以將選擇範圍限制爲用戶擁有的記錄,或者如果指定的用戶是管理員,則選擇該記錄。用戶模型必須實現一個名爲「is_admin?」的方法如果用戶被視爲管理員,則返回true。

這樣,您就可以撥打:

my_widgets = Widget.accessible_by(user).find(:all, :conditions => ["created_at > ?", 1.day.ago.to_s(:db)]) 

class Widget 
    named_scope :accessible_by, lambda {|u| 
     conditions = nil   
     unless u.is_admin? 
     conditions = ["widgets.user_id = :user_id", {:user_id => u.id}] 
     end 
     return {:conditions => conditions} 
    } 
end 
2

我找到最好的方法是避免在這樣的實際模型發現者......

SecretRecord.find(:id, :conditions => 'user = ?', current_user.id) 

,而使用集合關閉用戶對象

class User 
    has_many :secret_records 
end 

current_user.secret_records.find(id) 

這會自動作用域的選擇到那些屬於當前用戶的祕密記錄。

  • 我假設你已經叫你的認證系統(如restful_authentication)
+0

最好的例子,在這裏! – 2009-07-20 16:05:37

+0

...以及您如何處理管理員? – 2009-07-20 16:39:13

1

放一個過濾器,可用於訪問此信息

current_user.admin? or params[:person_id].to_i == current_user.person.id 

如果這個條件不滿足所有控制器的前重定向他們在其他地方

相關問題