0

我想让用户有机会更新一些用户信息。现在只有姓名和电子邮件。用户需要输入当前密码来授权更新。我尝试了几种方法,归结为以下问题:

在更新用户属性之前,我调用了“validate_password”方法。

users_controller.rb:

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


respond_to do |format|
  if validate_password(params[:password]) && @user.update_attributes(params[:user])
    format.html { redirect_to @user, notice: 'Account was successfully updated.' }
    format.json { head :no_content }
  else
    format.html { render action: "edit" }
    format.json { render json: @user.errors, status: :unprocessable_entity }
  end
end

结尾

application_controller.rb:

  def validate_password(pswd)
if current_user.password_hash == BCrypt::Engine.hash_secret(pswd, current_user.password_salt)
  true
else
  false
end

结尾

即使使用正确的密码“pswd”,它也会返回 false。我错过了什么吗?如果您知道正确的盐,您可以重新创建密码哈希吗?

4

2 回答 2

1

假设current_user.password_hash包含使用BCrypt::Password#create, 而不是

current_user.password_hash == BCrypt::Engine.hash_secret(...)

尝试

BCrypt::Password.new(current_user.password_hash) == passwd

不要自己腌制。这是多余的,因为 BCrypt 已经进行了加盐。

朝着好的方向迈出的另一步是放弃手写身份验证并使用现有的、经过实战考验的解决方案,例如Devise

于 2012-12-03T13:54:02.233 回答
1

您还可以使用:

validates_presence_of :password, :on => :create

这样,您将在更新时避免密码验证。

于 2013-03-01T01:01:38.527 回答