如何在不丢失旧密码的情况下从has_secure_password正确迁移到encrypted_pa​​ssword(因为两者都使用password_digest)?

时间:2018-01-22 04:11:53

标签: ruby-on-rails ruby devise ruby-on-rails-4.2

has_secure_password迁移到devise会在与用户对象交互时在控制台中导致以下错误:

.rvm/gems/ruby-2.4.1/gems/devise-4.4.0/lib/devise/models/database_authenticatable.rb:166:in `password_digest'

我理解这是因为设计使用了pasword_digest功能,因此它与password_digest active record使用的has_secure password列不兼容。

解决方案是从数据库中删除password_digest列,但我不想放弃现有用户'密码。

我应该删除已创建的encrypted_password列设计,然后进行迁移以将password_digest重命名为encrypted_password,然后更新现有用户的密码,还是有更合适的解决方案?

3 个答案:

答案 0 :(得分:4)

1>将列password_digest重命名为encrypted_password

2 - ;在config/initializers/devise.rb集合

中设计初始值设定项
config.stretches = 11 # this is default

3> bcrypt是默认的散列或加密算法(因此无需更改)。

请参阅devise config template

答案 1 :(得分:3)

我以前没有做过。但在我看来,让我们先尝试备份你的数据库。然后执行迁移以将password_digest更改为encrypted_pa​​ssword。不要担心,因为如果您的迁移无效,您可以回滚

答案 2 :(得分:2)

您的猜测和Sachin的解决方案是正确的。将memset()重命名为password_digest即可。

您不必为此更改encrypted_password。它只影响config.stretches生成新密码的方式。现有密码以散列形式存储它们的延伸数。