0

我对这个批量分配问题有点困惑。这是我的问题

假设我有一个具有以下属性的用户模型:名称登录密码电子邮件

在编辑期间,会触发更新方法:

def update
  @user = User.find(params[:id])
  if @user.update_attributes(params[:user]) 
   ....
end

在我看来,保护大多数(如果不是全部)这些属性是有意义的,因为我不希望密码/电子邮件/登录名受到损害。所以我会在模型中这样做

attr_accessible :名称

因此,除了名称之外的所有其他属性都无法批量分配。

如果我这样做,有效的编辑表单将如何工作?是否需要在更新方法@user.email = params[:user][:email]等中一一分配属性?还是我误解了什么(可能)?

谢谢!

编辑:

更加具体:

通常您会看到带有受保护的管理属性的示例。这是有道理的。

但是密码或电子邮件属性呢?这些通常不受保护。为什么密码或电子邮件不受保护?这可能意味着可能有人可以重置电子邮件并重置密码或重置密码属性并获得对系统的访问权限,不是吗?

4

2 回答 2

1

观看此 railscasts http://railscasts.com/episodes/26-hackers-love-mass-assignment/

您正在以错误的方式考虑批量分配安全性。attr_accessbile 不会向公众公开密码值(您将使用 filter_parameter 隐藏该值)。

这样想,你有一个用户表单。您希望用户能够使用密码创建帐户,但您不希望他们能够将自己添加为管理员(他们可以通过 sql 注入或操纵 POST 参数来做到这一点)。为了防止这种情况,您可以将 :name、:password、:email 添加到 attr_accessible 并省略 admin 字段。

于 2012-07-06T00:35:51.603 回答
0

想法是过滤控制器中的参数,如此处所述

class PeopleController < ActionController::Base
  # This will raise an ActiveModel::ForbiddenAttributes exception because it's using mass assignment
  # without an explicit permit step.
  def create
    Person.create(params[:person])
  end

  # This will pass with flying colors as long as there's a person key in the parameters, otherwise
  # it'll raise a ActionController::MissingParameter exception, which will get caught by 
  # ActionController::Base and turned into that 400 Bad Request reply.
  def update
    redirect_to current_account.people.find(params[:id]).tap do |person|
      person.update_attributes!(person_params)
    end
  end

  private
    # Using a private method to encapsulate the permissible parameters is just a good pattern
    # since you'll be able to reuse the same permit list between create and update. Also, you
    # can specialize this method with per-user checking of permissible attributes.
    def person_params
      params.required(:person).permit(:name, :age)
    end
end
于 2012-07-06T00:33:30.257 回答