如何在BCrypt中保存密码?

时间:2014-12-28 08:09:51

标签: ruby-on-rails

我安装了bcryptbcrypt-ruby宝石并尝试:

class User < ActiveRecord::Base
    before_save :encrypt

    def encrypt
        password = BCrypt::Password.create(:password) 
    end
end

def create
    @user = User.new(user_params)
    if @user.save
        redirect_to "http://bookworm.az:3000"
    end
end

但它并没有在BCrypt中拯救。我好像,我做错了什么。在github社区中写道:add require&#39; bcrypt&#39;在用户模型的顶部,在类User&lt;之前ActiveRecord :: Base但在这种情况下,我的应用程序将保存在数据库bcrypt中以获取所有字段。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

这很容易使用宝石,例如Devise(它做了很多)或Sorcery(它做得少,所以可能更容易理解和改变你喜欢的。)

如果你想自己编写代码,我个人就是这样做的。

# The file is ./app/models/password_attribute.rb
require 'bcrypt'
module PasswordAttribute

  # Read the :password attribute as a new BCrypt::Password.
  # Return the BCrypt::Password.
  def password
    BCrypt::Password.new(password_before_type_cast)
  end

  # Write the :password attribute as a new BCrypt::Password.
  def password=(plain_text)
    write_attribute(:password,BCrypt::Password.create(plain_text))
  end
end

然后是用户模型:

class User
  include PasswordAttribute
   ...
end

用法:

user=User.new
user.password='secret'  # automatically converts plain text to bcrypt
user.save

用户密码有效吗?

if user.password=='secret' 
  # password is valid
else
  # password is invalid
end

获取并设置:

u.password='secret'
=> user's password is now secret

u.password=='secret'
=> true

u.password=='xxx'
=> false

答案 1 :(得分:0)

你可以尝试使用:

def encrypt
   self.password = BCrypt::Password.create(:password) 
end

您正在为加密方法定义本地变量密码,您需要使用self.password访问class属性,这就是为什么它不保存加密密码。