2012-10-19 51 views
0

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

我有工作,使创建新用户的工作,他们可以登录就好在新系统上。问题是我需要现有的用户能够将他们的密码从hashed_pa​​ssword迁移到password_digest。做这件事的最好方法是什么?

+0

是否确定与你,你将不得不为每个用户设置(而不是他们的当前密码)一个新的密码? –

+0

@JesseWolgamott,可能不是。这是一个广泛使用的应用程序,我感觉我的老板不喜欢这样的感觉。 – Bholzer

+1

你会很难过。您无法解密哈希,并且2验证系统使用不同的哈希算法。总之:你不能做你想做的事情。 –

回答

2

这是可能的,但你必须兼顾了一下。假设您在迁移之前使用过MD5来散列密码。确保在迁移之前进行了备份:)将一个布尔列migrated_password添加到数据库,默认为true。在您的迁移中,为现有用户执行类似User.update_all(migrated_password: false)的操作。

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

如果不是,你将其送入authenticate方法之前哈希与MD5密码。如果登录成功,则用参数中的输入密码更改该用户的密码,并将migrated_pa​​ssword列更新为false(在交易中包装这两个操作)。

经过一定的时间,你可以删除的migrated_pa​​ssword柱和迁移代码,并让用户使用密码重设功能,如果他们仍然需要访问,但在时间上没有迁移。

相关问题