2011-08-11 48 views
1

如何防止基於會話變量訪問特定的一組記錄?如何防止訪問屬於不同用戶的記錄

即我有一個用user_id鍵的項目表,我如何過濾對基於user_id的項目的訪問。我不希望有人能夠訪問/項目/ 3 /編輯,除非該項目有其用戶ID反對它(基於會話變種)

更新: 我使用@ fl00r建議的答案與一變化,使用find_by_id(),而不是找到(),因爲它返回一個零,可以處理相當不錯:

@item = current_user.items.find_by_id([params[:id]]) || item_not_found 

其中item_not_found在應用程序控制器的處理,只是提出了一個路由錯誤。

+1

我覺得這個問題有點模糊,但你嘗試過使用[命名範圍](http://ar.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html)?還有類似[CanCan](https://github.com/ryanb/cancan)的授權? – Augusto

回答

3

通過您的current_user對象獲取的項目限制訪問(User應該:has_many => :items

# ItemsController 
def edit 
    @item = current_user.items.find(params[:id]) 
    ... 
end 

其中current_user是一種User.find(session[:user_id])

UPD

有用Railscast的:http://railscasts.com/episodes/178-seven-security-tips,提示#5

+0

在這種情況下,用戶可以在地址欄中輸入直接路徑:/ artilces/1/edit – Meduza

+0

@Meduza等等? – fl00r

+1

@Meduza,是的,這是我最初試圖避免的 - 這種解決方案適用於我,但我只是使用404,如果沒有找到。 –

2

您可以檢查顯示/編輯/更新方法獲得:

def edit 
    @item = Item.find(params[:id]) 
    restrict_access if @item.user_id != current_user.id 
    .... 
end 

,並添加RESTRICT_ACCESS方法,例如在application_controller

def restrict_access 
    redirect_to root_path, :alert => "Access denied" 
end 
相關問題