2009-07-07 123 views
2

我已經有rails_authorization_plugin啓動並使用模型運行。何時何地實施ACL

在我的網站上實施權限檢查的最佳方式是什麼?

我有一個複雜的條件,當一個對象的實例應該是可見的,是否有一種有效的方式將它們鏈接在一起,所以我沒有獲取多組數據,並且由於循環返回數據而磨損了我的數據庫過濾它?

回答

1

有一種有效的方法:確保只運行一個查詢,並且運行的查詢完全返回所需的對象。當然,說起來容易做起來難。

處理此問題的一種方法是使用範圍構建您的條件。

@posts = @thread.posts.not_deleted.this_week.not_secret 

如果所有這些方法都是範圍,那將只有一個查詢。

如果您的條件過於複雜,無法輕鬆使它們成爲範圍,那麼您應該編寫一個方法來返回用戶的可見對象。

class User 
def posts_for(thread) 
    if is_admin? 
    thread.posts 
    elsif thread.owner == self 
    thread.posts.not_deleted 
    else 
    Post.find(:all, :conditions => something_complicated(thread, self)) 
    end 
end 
end 

我的應用程序有很多類型的對象,而且非常複雜的權限的,所以我們捕捉的method_missing這樣的電話,他們的路線,知道如何使所有不同的查詢權限庫。

+0

嗯,我正在使用非常簡潔的rails acl插件,但我不認爲我可以用它來鏈接,我可以嗎? 是否有任何ACL插件的行爲幾乎像是activerecord的擴展? rails acl的文檔提供了很多開始,但實際上實施安全檢查讓我猜測很多。 感謝您的幫助,真的很好的建議已經在這裏! – 2009-07-09 17:01:42