将现有身份验证迁移到has_secure_password

时间:2012-10-19 17:58:45

标签: ruby-on-rails ruby-on-rails-3

在我的应用程序中,我有两个不同的用户帐户。旧帐户类型使用自定义构建的身份验证系统。较新的实现has_secure_password。现在我准备将旧帐户类型移动到同一系统。在数据库中,该用户类型具有hashed_pa​​ssword列。

我让它工作,以便创建新用户,并且他们可以在新系统上正常登录。问题是我需要现有用户能够将他们的密码从hashed_pa​​ssword迁移到password_digest。这样做的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

这是可能的,但你不得不耍弄一下。我们假设您在迁移之前已使用MD5哈希密码。确保在迁移之前已进行备份:)将一个布尔列migrated_password添加到数据库,默认为true。在迁移过程中,请为现有用户执行User.update_all(migrated_password: false)之类的操作。

使用当前的MD5哈希值作为has_secure_password函数的输入。更改登录代码以处理两个路径,具体取决于migrated_pa​​ssword列的值。如果密码已迁移(或用户在迁移后注册),则直接使用has_secure_password。

如果不是,则在将密码提供给authenticate方法之前,使用MD5对密码进行哈希处理。如果登录成功,请使用params中的输入密码更改该用户的密码,并将migrated_pa​​ssword列更新为false(在事务中包装这两个操作)。

经过一段时间后,您可以删除migrated_pa​​ssword列和迁移代码,并允许用户使用您的密码重置功能,如果他们仍然需要访问但未及时迁移。