我正在尋找一種好的ruby方法來限制誰可以調用方法。這個例子發生在rails環境中,但它並不特定於rails。如何限制誰可以調用ruby方法
我有一個稱爲文檔的模型,處理查找文件夾內的文檔。文件夾被許可,所以我有一個處理權限的類。在很大程度上簡化形式權限公開接口檢索文件:
class Permissions
def documents(folder_list)
#strip folders from folder_list user doesn't have permissions for
Document.where("folder.name in (?)", permissioned_folder_list)
end
end
功能能正常工作,但RSpec的測試是一個惡夢,當查詢比這簡單的例子要複雜得多。我們最終會得到很多關於如何存儲文檔的機制的期望。真的我想有更多這樣的東西:
class Permissions
def documents(folder_list)
#strip folders from folder_list user doesn't have permissions for
Document.documents(permissioned_folder_list)
end
end
class Document
self.documents(folder_list)
Document.where("folder.name in (?)", folder_list)
end
end
這將是很好的因素,易於測試。麻煩的是,現在在Document上提供了一個接口,它看起來像一個很好的域級接口,但完全繞過了權限。對於某個人來說,使用它很容易,並且獲得完全不正確的合理結果。
我想要做的是防止Document :: documents方法被除權限實例以外的其他任何東西所調用。它不是萬無一失的,因爲你仍然可以調用全部或者哪裏並繞過權限,但是當有一個方法可以清楚地處理所有對你的問題時,你必須重新創建所有複雜的查詢邏輯,但是除非你通過權限。
什麼是做這樣的事情的慣用ruby方式? BTW,因爲權限存儲在用戶的會話中,調用Document並讓它調用Permissions而不是調用Permissions並讓它調用Document是相當混亂的。