【问题标题】:Ruby on Rails - Bcyrpt update user attributes with password confirmationRuby on Rails - Bcyrpt 通过密码确认更新用户属性
【发布时间】:2012-12-03 13:38:33
【问题描述】:

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

我在更新用户属性之前调用了“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。 我错过了什么吗?如果您知道正确的盐,您可以重新创建密码哈希吗?

【问题讨论】:

  • 'end' 属于代码,格式让我失望 ;)
  • 为什么你确定你在创建用户时有这个精确的散列?验证器也可以是单行,如果根本没有,只是条件。
  • “验证”只是我的方法名称。也许会误导它不是验证器。更多“检查密码正确”的方法。哈希的创建:pastebin.com/nv09i0ky
  • 我也会投票支持@Jan 解决方案,尽管您所做的事情对 Ryan 有用。您可以从控制台尝试该过程,以确保一切正常。乍一看还不错。

标签: ruby-on-rails ruby bcrypt


【解决方案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.

【讨论】:

  • 哈希是这样创建的:pastebin.com/nv09i0ky(跟随 railscast)
  • 你能用BCrypt::Password#create创建它吗?
  • 对于登录,用户使用他的电子邮件和密码进行身份验证。 (pastebin.com/dvWRXsde).. 工作没有问题。我现在想要实现的甚至更简单(没有电子邮件)。我的主要目标是在使用 gems 之前了解基础知识,这为我完成了所有工作。 (我对 Rails 还是很陌生)。我不明白为什么它现在失败了,但模型中的电子邮件身份验证正在工作
【解决方案2】:

你也可以使用:

validates_presence_of :password, :on => :create

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

【讨论】:

    猜你喜欢
    • 2021-06-04
    • 1970-01-01
    • 2011-04-08
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多