在我的应用程序中,我有两个不同的用户帐户。旧帐户类型使用自定义构建的身份验证系统。较新的实现了 has_secure_password。现在我已准备好将旧帐户类型移至同一系统。在数据库中,该用户类型有一个 hashed_password 列。
我让它工作,以便创建新用户工作,他们可以在新系统上正常登录。问题是我需要现有用户能够将他们的密码从 hashed_password 迁移到 password_digest。这样做的最佳方法是什么?
在我的应用程序中,我有两个不同的用户帐户。旧帐户类型使用自定义构建的身份验证系统。较新的实现了 has_secure_password。现在我已准备好将旧帐户类型移至同一系统。在数据库中,该用户类型有一个 hashed_password 列。
我让它工作,以便创建新用户工作,他们可以在新系统上正常登录。问题是我需要现有用户能够将他们的密码从 hashed_password 迁移到 password_digest。这样做的最佳方法是什么?
这是可能的,但你必须玩弄一下。假设您在想要迁移之前使用 MD5 对密码进行哈希处理。确保在迁移之前进行了备份 :)migrated_password
向数据库添加一个布尔列,默认为 true。在您的迁移中,User.update_all(migrated_password: false)
对现有用户执行类似操作。
使用当前的 MD5 哈希作为has_secure_password
函数的输入。根据 migrated_password 列的值,更改您的登录代码以处理两个路径。如果密码被迁移(或迁移后注册的用户),您可以直接使用 has_secure_password 。
如果不是,则在将密码输入authenticate
方法之前使用 MD5 对密码进行哈希处理。如果登录成功,则使用参数中的输入密码更改该用户的密码,并将 migrated_password 列更新为 false(将这两个操作包装在事务中)。
一定时间后,您可以删除 migrated_password 列和迁移代码,并让用户在仍需要访问但未及时迁移的情况下使用您的密码重置功能。