更新用户会创建一个空密码的新哈希:(

时间:2010-04-21 14:29:15

标签: ruby-on-rails

我正在为Rails创建用户系统,并登录,注册等......一切正常。真棒!至少,这就是我的想法。我尝试更新用户的profile属性,但我没有发送新的密码或用户名。我在User模型中使用它:

protected

def after_validation
  self.password = Password::update(self.password)
end

Password::update方法会为安全性设置盐和哈希密码。问题是,每当我保存时没有指定password,Rails会尝试保存一个空密码。我在UsersController

中使用此功能
  # PUT /users/1
  # PUT /users/1.xml
  # PUT /users/1.json
  def update
    @user = current_user

    respond_to do |format|
      if @user.update_attributes(params[:user])
        flash[:notice] = 'User was successfully updated.'
        format.html { redirect_to(@user) }
        format.xml  { head :ok }
        format.json { head :ok }
      else
        @user.password = "[FILTERED]" # Hide for security
        format.html { render :action => "edit" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
        format.json { render :json => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

但是,我的模型验证了空密码,但仍保存了(n)(盐渍哈希)空密码。但它应该只保存:profile字段,如果这是唯一给定的字段(以及:updated_at字段)。

所以我的意思是,当我更新记录而不指定当前密码时,密码属性仍然保存为空字符串的哈希值。我希望update_attributes如果没有设置密码,应该忽略密码。

有人可以帮忙吗?感谢

2 个答案:

答案 0 :(得分:0)

我不完全确定我理解你的问题,但是如何添加:

validates_presence_of :password

def before_create
  self.password = Password::update(self.password)
end

答案 1 :(得分:0)

我自己已经找到了。

我必须检查密码是否已更改:

def after_validation
  self.password = Password::update(self.password) if password_changed?
end