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