2012-01-25 38 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

相关问题