jmc*_*tie 32 ruby-on-rails devise
我正在尝试从旧数据库迁移大量用户.为此,我使用activerecord-import并尝试将所有用户数据直接保存到DB(绕过用户模型).
我的问题:我需要使用旧用户的纯文本密码,加密它,并直接存储到数据库.我知道如何使用Devise 生成密码,但我想知道是否有办法获得可以直接存储到数据库的哈希密码.
希望这样做:
new_hashed_password = Devise.awesome_encrypting_method(old_user.password)
Run Code Online (Sandbox Code Playgroud)
然后将"new_hashed_password"直接存储到数据库中,而无需通过模型.我在Devise挖了一遍,发现了这个:
def password_digest(password)
::BCrypt::Password.create("#{password}#{self.class.pepper}", :cost => self.class.stretches).to_s
end
Run Code Online (Sandbox Code Playgroud)
@@ stretches默认为10(lib/devise.rb:71),并且不会被初始化程序覆盖
@@ pepper默认为nil(lib/devise.rb:148),并且不被我的初始化程序覆盖
我以为我可以手动重新创建password_digest(),但我认为我缺少一些关于Bcrypt的基本信息,因为即使设置了密码和延伸,每次产生的哈希都是不同的.
有任何想法吗?谢谢你的帮助!
Rob*_*jic 59
你应该这样做:
password = 'the secret password'
new_hashed_password = User.new(:password => password).encrypted_password
Run Code Online (Sandbox Code Playgroud)
这比直接使用BCrypt要好得多,因为它抽象了代码生成密码的方式,使其更容易理解,并且不受设计加密密码设置方式的变化的影响.您的代码不应该,也没有理由知道任何相关信息.
jmc*_*tie 19
好消息和坏消息.
以下内容适用于手动创建用户密码.
pepper = nil
cost = 10
encrypted_password = ::BCrypt::Password.create("#{password}#{pepper}", :cost => cost).to_s
Run Code Online (Sandbox Code Playgroud)
您可以在设计初始化程序中找到您的辣椒和成本.使用Devise的"valid_password?"确认了这个方法.方法.
我试图避免"User.new(密码:密码).encrypted_password"的全部原因是因为速度.这非常慢.在我的所有其他部分导入任务中,我故意避免这种情况.
但事实证明,这里的主要成本不是实例化User对象 - 而是BCrypt本身.直接使用BCrypt时几乎没有明显的速度提升,因为它故意设计得很慢.
我的最终答案是:吮吸它,运行rake脚本,去寻找饮料.