使用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
相关产品推荐
相关产品推荐

