You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用bcrypt-ruby和has_secure_password无法保存重置密码的问题

问题:从Devise迁移至自定义认证流程时的密码重置存储问题

我们正从Devise迁移至更精简的自定义认证流程,当前遇到的问题是:用户提交用户名重置密码时,邮件发送的新密码无法存入系统。

Gemfile配置

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

User模型代码

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控制器代码

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时出现**"invalid hash"**错误
  • 改为self.password_digest = newpass后流程无报错,但在Rails控制台中执行puts u.password_digest返回=> nil

最终处理

我们调整了方案,不再通过邮件发送密码。


内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:33:13