我正在try 从旧数据库迁移大量用户.为此,我使用activerecord导入并try 将所有用户数据直接保存到DB(绕过用户模型).

我的问题是:我需要获取老用户的纯文本密码,对其进行加密,然后直接存储到数据库中.我知道如何使用Desive输入密码,但我想知道是否有办法获得一个哈希密码,我可以直接存储到数据库中.

希望做到:

new_hashed_password = Devise.awesome_encrypting_method(old_user.password)

然后将"新的散列密码"直接存储到数据库中,而无需查看模型.我在Desive里翻找,发现了这个:

def password_digest(password)
  ::BCrypt::Password.create("#{password}#{self.class.pepper}", :cost => self.class.stretches).to_s
end

@@拉伸默认为10(lib/designe.rb:71),并且不会被我的初始值设定项覆盖

@@pepper默认为nil(lib/devise.rb:148),不被我的初始值设定项覆盖

我以为我可以手动重新创建password_digest(),但我觉得我缺少了Bcrypt的一些基本功能,因为即使设置了password和Stretch,每次生成的哈希值都是不同的.

有什么 idea 吗?谢谢你的帮助!

推荐答案

好消息和坏消息.

好消息:

下面是手动创建用户密码的步骤.

 pepper = nil
 cost = 10
 encrypted_password = ::BCrypt::Password.create("#{password}#{pepper}", :cost => cost).to_s

你可以在Desive初始化器中找到你的花椒和成本.这种方法是通过使用Desive的"有效密码"确认的方法

坏消息:

我之所以试图避免"User.new(password:password.encrypted_password)"是因为速度.太慢了.对于导入任务的所有其他部分,我都故意避免了这一点.

但事实证明,这里的主要成本不是实例化用户对象,而是BCrypt本身.直接使用BCrypt时,几乎没有明显的速度提升,因为它是故意设计为缓慢的.

我的最终答案是:吸起来,运行rake脚本,go 找饮料.

Ruby-on-rails相关问答推荐

未捕获语法错误:try 编辑TRIX时,请求的模块未在Rails 7.1中提供名为默认的导出(在youtube.js:1:8)

CanCanCan、Pagy 和 Meil​​iSearch,如何组合这 3 个 gem?

无效的单表继承类型:Rails

Rails - 如何从 http://example.com 重定向到 https://www.example.com

Ruby on Rails 中的消息队列

我如何存根 find_each 以在 rails 3 中进行 rspec 测试

默认情况下,如何在 Rails 中使 cookie 安全(仅限 https)?

rails 模型 has_many 本身

在 Rails 中,如何处理多个选中的复选框,只需拆分 , 或?

rails 方法获取模型的关联名称

从 Rails 模型内部访问翻译文件 (i18n)

Rails:仅当值存在时如何验证格式?

rails 4 before_validation on: :create 或 on: :save

我们如何在 Rails Mailer 中设置邮箱发件人的名称?

rails active admin 部署:找不到文件'jquery-ui'

为什么 Ruby on Rails 使用 http://0.0.0.0:3000 而不是 http://localhost:3000?

Rails 控制台中手动更新属性值的验证问题

我怎样才能看到水豚在失败的黄瓜步骤中发现了什么?

如何翻译 ActiveRecord 模型类名称?

Rails - 邮件,将正文作为纯文本获取