2010-11-17 69 views
0

我正在使用傳統的rails代碼庫,並且需要實現一些不基於對象的標準CRUD操作的ACL邏輯,而是圍繞有關頁面的哪些部分顯示給不同組用戶。這些頁面「部分」不是由數據庫中的任何對象定義的,所以我的猜測是基於對象的ACL系統可能不是最適合的。Rails ACL設計問題

我目前正在研究declarative_authorization,但尚未確定它是否可以執行除基於對象的權限之外的任何操作。

這對於Web應用程序來說必須是一個相當常見的用例,我寧願不要再推出另一個ACL。有沒有人有第三方圖書館的建議,這將很好地工作?

+0

我通過回顧這個問題了解了更多關於何時使用ACL的內容,http://stackoverflow.com/questions/3164550/when-should-i-use-acl-in-my-application,但仍然沒有更接近到答案。 – Prairiedogg 2010-11-18 14:58:56

回答

3

我認爲CanCan可以幫到你。它使用簡單,應該只是你需要的。這裏有一個RailsCast:Authorization with CanCan

+1

試用CanCan之後,我發現您不必堅持使用CRUD權限。您可以在任何模型或'nil'對象上聲明自定義權限。 – Prairiedogg 2010-11-18 17:02:18

2

我已經瀏覽了一大堆不同的授權和ACL插件,就像你我不喜歡大多數人使用的CRUD方法。

最後,最適合我的是一個類似於Redmine使用的設置。我不知道它是否來自任何指定的插件,但我花了一些時間去了解它,並對我的案例做了必要的調整。

基本上它允許使用控制器和操作,無論是全局模型還是特定模型。開始時你指定什麼不同的權限分配:

MyApplication::ACL.mapper do |map| 
    map.permission :view_project, {:projects => :show} 
    map.permission :manage_project, {:projects => [:update, :edit, :post_status]} 
    map.permission :delete_project, {:projects => :destroy} 
end 

下一個步驟是將一個或更多的權限分配給角色是一個序列化領域的典範,其可以存儲任何權限,即:

<#Role id: 1 name: "Intern" permissions: [:view_project] > 
<#Role id: 2 name: "Member" permissions [:view_project, :manage_project] > 

然後通過成員資格模型映射不同的用戶角色。成員資格還可以與特定模型(如Project)進行映射,因爲您可能被允許管理一個項目而不是另一個項目,或者它可以是全局的,如應該限制的某些索引操作,但您不知道要授權哪個模型反對呢。

在您驗證這一切的控制器使用:

before_filter :authorize, :only => [:show, :update, :edit, 
             :post_status, :destroy] 

,並授權當然是檢查當前用戶是具有電流控制器和所需的權限的任何角色的成員方法行動。

雖然這裏只是一個很長的描述,但總的來說它的工作原理:)它比其他ACL插件更復雜,但我認爲這是最「乾淨」的選擇,同時仍然允許靈活性,我需要。