如何正确地从 has_secure_password 迁移到 encrypted_password(因为两者都使用 password_digest),而不会丢失旧密码?

14

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'

我明白这是因为Devise使用了password_digest函数,所以它与Active Record的has_secure_password使用的password_digest列不兼容。

一种解决方法是从数据库中删除password_digest列,但我不想失去现有用户的密码。

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


你尝试过建议的解决方案了吗? - Sachin Singh
3个回答

7
1> 将列名password_digest更名为encrypted_password
2> 在devise初始化程序中的config/initializers/devise.rb中设置。
config.stretches = 11 # this is default

3> bcrypt 是默认的哈希或加密算法(因此不需要更改)。

请参阅 devise 配置 模板


3

我以前没有这样做过。但是我认为,我们应该先尝试备份数据库。然后执行迁移以将password_digest更改为encrypted_password。不用担心,如果迁移失败可以回滚操作。


2
你的猜测和Sachin的解决方案都是正确的。将password_digest重命名为encrypted_password就可以解决问题了。
你不需要更改config.stretches,因为它只影响devise生成新密码的方式。现有的密码在其哈希中存储了其拉伸次数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接