2012-10-01 23 views
2

我正在使用Rails,Devise和Mongoid。Rails + Devise:如何限制用戶編輯不屬於他的記錄

用戶只能有一個項目(has_one :profile),但所有用戶(和未經過驗證的用戶)都可以看到項目列表(我有這個工作)。當用戶登錄後,他們會看到項目旁邊的「編輯和刪除」按鈕(通過將這些按鈕包裝在<% if user_signed_in? %>中)。但是,登錄用戶可以在所有項目旁邊看到這些按鈕,並且可以編輯或刪除所有項目。

如何限制登錄用戶只能編輯他的項目?

作爲獎勵,是否可以在屬於已登錄用戶的項目中顯示特定內容或html(例如,「這是您的項目」或項目的html附加的類)?

+1

您描述的條件可以做到這一點,但您可以檢查出https://github.com/ryanb/cancan/以獲得更穩健的解決方案 – rjz

+0

我不確定我是否應該使用can can for that or not,我想我應該。 – sevens

+2

如果user_signed_in,您可以添加另一個條件<%?和project.user == current_user%>,但CanCan是一個更好更安全的解決方案,您希望在控制器/模型級別上完成權限,而不是視圖。 – iouri

回答

2

設計是爲了控制「認證」,這不應該是你的責任。

你想控制「授權」,因爲CanCan更好。

5

CanCan非常棒,當你有多個用戶可以修改相同的資源,並且你需要跟蹤誰擁有哪些權限。但是,如果嚴格地說只有擁有該項目的用戶纔可以修改它,CanCan可能是矯枉過正的。

隱藏在視圖中的鏈接通過尤里的建議,然後在你的控制器做這樣的事情:

def edit 
    if current_user != @project.user 
    # Redirect them to an error page 
    else 
    # Render the view 
    end 
end 

更重要的是,創建一個方法,如:

def user_owns_project? 
    @project.user == current_user 
end 

然後設置之前篩選編輯,更新和銷燬重定向到錯誤頁面,如果用戶不擁有該項目。

編輯:你之前的過濾器也將ned找到項目並設置@project。 CanCan也可以爲你處理這個問題,load_and_authorize_resource,但是我仍然會避免使用它,除非你需要,或者期望需要細粒度的權限控制。

+0

如何將用戶與項目相關聯,以便能夠使用以下表達式:'project.user == current_user'? –

相關問題