2012-01-25 37 views
2

我有一個表單,允許用戶更新他們的個人資料信息,但我想阻止一些信息被更改。我也想保持我的控制器代碼非常簡單。在我的用戶控制的更新動作,我有以下代碼:如何停止將表單添加到字段的用戶表單?

def update 
    @user = Users.find params[:id] 

    if @user.update_attributes(params[:user]) 
    flash[:notice] = 'Update successful.' 
    redirect_to user_path(@user) 
    else 
    render :action => :edit 
    end 
end 

這是非常乾淨和簡單,我喜歡這樣。然而,我不喜歡的是,用戶可以在表單中添加一個字段,名稱與屬性相同,並用它來修改禁止的屬性。有沒有簡單的方法來做到這一點,還是我需要設計一種方法來做到這一點?

我正在考慮的一種方法是使用所有表單元素名稱的hash-based message authentication code生成散列值。此消息訪問代碼將是表單中的隱藏值。然後,一旦表單被提交,我會再次使用參數Hash的鍵的名稱來計算消息訪問代碼(MAC)。如果兩個MAC不同,或者如果參數Hash中缺少第一個MAC,我會拋出一個錯誤。如果在那裏已經有了解決方案,我寧願不花時間來實施。

謝謝。

回答

1

在你的模型,你可以使用attr_protectedattr_accessible黑名單或者通過質量分配(當一個表單提交等)被設置白名單屬性。

+0

我也發現了上面的內容。我知道attr_accessible和attr_protected,但我覺得他們爲我的應用增加了不必要的複雜性。例如,用戶不應該能夠修改他們的用戶名,但管理員應該能夠修改每個人的用戶名。像@ user.update_attribute(:login,params [:login])如果current_user.role::admin'看起來很麻煩,這種類型代碼的多行需要進入我的所有控制器。在我的CanCan能力文件中已經定義了很多邏輯,所以會有相當多的代碼重複。 – Max

+0

- http://enlightsolutions.com/articles/whats-new-in-edge-scoped- mass-assignment-in-rails-3-1 – Nate

+0

謝謝Nate,這正是我所需要的。 – Max

1

如果在模型中使用attr_protected :protectedcolumn(黑名單)或attr_accessible :safecolumn(白名單),則導軌將阻止批量分配。有關此主題的更多信息可以在Ruby on Rails Security Guide (Section 6.1)

+0

我知道attr_accessible和attr_protected,但我覺得他們給我的應用增加了不必要的複雜性,例如,用戶不應該是能夠修改他們的用戶名,但是管理員應該能夠修改每個人的用戶名。如果有'@ user.update_attribute(:login,params [:login]'如果current_user.role?:admin'似乎很麻煩。這種類型的代碼將需要去進入我的所有控制器。還有一件壞事是,我的CanCan能力文件中已經定義了很多邏輯,所以會有相當多的代碼重複。 – Max

相關問題