Я пытаюсь переопределить метод authenticate
в этом файле: https://github.com/rails/rails/blob/f33d52c95217212cbacc8d5e44b5a8e3cdc6f5b3/activemodel/lib/active_model/secure_password.rb#L61
Я должен убедиться, что если пользователь без password_digest
попытается пройти аутентификацию, метод возвращает false вместо повышения BCrypt::Errors::InvalidHash
Я должен сделать это, потому что в прошлом у нас была другая система аутентификации, и у многих пользователей был нулевой пароль_диска. метод аутентификации используется в разных местах, и мы не можем поставить пустой password_digest
пользователям без пароля_digest.
Я пробовал это:
# config/initializers/secure_password.rb
module ActiveModel
module SecurePassword
class InstanceMethodsOnActivation
def authenticate(unencrypted_password)
begin
BCrypt::Password.new(password_digest).is_password?(unencrypted_password) && self
rescue BCrypt::Errors::InvalidHash => e
false
end
end
end
end
end
Это мой тест:
it 'should authenticate with false response if no digest (legacy password system)' do
user.activate!
user.update(password_digest: nil)
expect(user.authenticate('test')).to be false
end
И сообщение об ошибке:
BCrypt::Errors::InvalidHash: invalid hash
0) User should authenticate with false response if no digest (legacy password system)
Failure/Error: expect(user.authenticate('test')).to be false
BCrypt::Errors::InvalidHash:
invalid hash
Я обновляю наше приложение до Rails 6, и SecurePassword был переписан, я не могу изменить метод снова. Я думаю, проблема в том, что метод authenticate теперь определен в методе инициализации InstanceMethodsOnActivation. Я нахожу это странным ... И я не знаю, как это изменить.
Пожалуйста, кто-нибудь может мне помочь?