Как правильно перенести из has_secure_password в encrypted_password (как и использовать password_digest) без потери старых паролей?

Миграция из has_secure_password для разработки вызывает следующую ошибку в консоли при взаимодействии с объектами пользователя:

.rvm/gems/ruby-2.4.1/gems/devise-4.4.0/lib/devise/models/database_authenticatable.rb:166:in `password_digest'

Я понимаю это потому, что devose использует функцию pasword_digest и поэтому несовместим с столбцом password_digest, используемым active record has_secure password.

Решение состоит в удалении столбца password_digest из db, но я не хочу потерять пароли существующих пользователей.

Должен ли я удалить созданный конструктор столбца encrypted_password, а затем выполнить переход для переименования password_digest в encrypted_password, а затем обновить существующие пароли пользователей или есть более подходящее решение?

Ответ 1

Я раньше этого не делал. Но, на мой взгляд, попробуйте сначала создать резервную копию базы данных. Затем выполните миграцию, чтобы изменить пароль_digest на encrypted_password. Не волнуйтесь, потому что вы можете откатить свою миграцию, если она не работает.

Ответ 2

1 > Переименуйте столбец password_digest в encrypted_password.

2 > При разработке инициализатора в config/initializers/devise.rb установите

config.stretches = 11 # this is default

3 > bcrypt - это алгоритм хэширования или шифрования по умолчанию (поэтому изменений не требуется).

См. devise config template.

Ответ 3

Ваше предположение и решение Sachin верны. Переименуйте password_digest в encrypted_password, и он будет работать.

Вам не нужно менять config.stretches для этого. Это влияет только на то, как devise создает новые пароли. Существующий пароль хранит их количество растяжек в их хеше.