无法使用 bcrypt-ruby 和 has_secure_password 保存密码

Unable to save password utilizing bcrypt-ruby and has_secure_password

提问人:Jay 提问时间:7/15/2023 最后编辑:Jay 更新时间:7/16/2023 访问量:28

问:

我们正在从 Devise 转向更简化的身份验证流程。如果我能解决以下问题,我想我可以让其余的身份验证过程正常工作。

如果我们的一位客户丢失了密码,他们可以提交他们的用户 ID,我们将向他们发送一封包含新密码的电子邮件。电子邮件中发送的密码未保存在我们的系统中。

宝石文件:

  gem 'bcrypt-ruby', '3.1.2'

数据库架构:

  create_table "users", force: :cascade do |t|
    ...
    t.string   "username", limit: 255, null: false
    t.string   "password_digest", limit: 255
    ...
  end

用户模型:

  has_secure_password
  ...
  attr_accessible ... :username, :password_digest, :password, :password_confirmation,...
  ...
  def set_password(len = 12)
    chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
    newpass = ""
    1.upto(len) { |i| newpass << chars[rand(chars.size-1)] }
    self.password = self.password_confirmation = newpass
  end

users_controller:

  def send_new_password
    @user = User.find_by_username(params[:username])

    pw = @user.set_password
    @user.save

    UserMailer.new_password(@user).deliver_now
    redirect_to sign_in_path
  end
  ...
  def user_params
      params.require(:user).permit(... :username, :password_digest, :password, :password_confirmation,... )
  end

我在这一行上得到无效的哈希值:'self.password = newpass'。如果我将其更改为“self.password_digest = newpass”,则所有操作都会继续进行,但是在rails控制台中检查“put u.password_digest”会产生“=> nil”。

结果:我们改变了方法。不再在电子邮件中发送密码。

Ruby-on-Rails Ruby-on-Rails-4 bcrypt-ruby

评论

1赞 dbugger 7/15/2023
问题是?

答:

2赞 gef 7/15/2023 #1

这可能不是您想要的答案,但向用户发送密码是一种不好的做法。任何告诉你否则的人都是错误的。

设计宝石有一个专门用于重置密码的模块,其中包括通过电子邮件发送一个链接,供用户恢复和设置自己的密码:https://www.rubydoc.info/github/heartcombo/devise/main/Devise/Models/Recoverable