Модификация функции rails authenticate_user для поддержки нестандартной нотации bcrypt в PHP - PullRequest
0 голосов
/ 16 октября 2018

У меня есть приложение rails, которое использует таблицу Users, которая была сгенерирована и заполнена через приложение laravel.

проблема, с которой я сталкиваюсь, связана с другой статьей stackoverflow

Перенос таблицы пользователей из Laravel в Ruby и использование BCrypt для декодирования паролей не работает

Мне нужно, чтобы оба приложения продолжали работать, но все пользователи в настоящее время используют нестандартную нотацию PHP для паролей, зашифрованных в bcrypt.Преобразование довольно просто.@tadman опубликовал решение о том, как использовать пароль, сгенерированный laravel, в ruby ​​

BCrypt::Password.new(hash.sub(/\A\$2y/, '$2a'))

, но сейчас я пытаюсь выяснить, как на самом деле использовать его для аутентификации rails ...

Я изучал возможность установки метода authenticate_user из класса ActiveModel::SecurePassword, но не уверен, что это хороший способ подойти к этому.

Другой способ, которым я думалвнесение соответствующих изменений во все зашифрованные пароли пользователей, чтобы они соответствовали стандартному формату Bcrypt, но тогда мне нужно было бы внести изменения в работу функции laravel для аутентификации пользователей ... Эфирным способом я должен где-то изменить реализацию.

Есть ли способ, который является менее инвазивным в библиотечный код?

Спасибо

1 Ответ

0 голосов
/ 23 октября 2018

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

Я создал новый каталог под названием extensions в каталоге lib/, где я организовал свой monkeypatch на основе того, с чем он был связан.

lib/ext/rails/secure_password.rb

module ActiveModel
  module SecurePassword
    module InstanceMethodsOnActivation

      def authenticate(unencrypted_password)
        BCrypt::Password.new(password_digest.sub(/\A\$2y/, '$2a')).is_password?(unencrypted_password) && self
      end

    end
  end
end

Я также создал файл ext.rb в каталоге инициализаторов, который будет загружать класс monkeypatch

config/initializers/ext.rb

Dir.glob(Rails.root.join('lib/ext/**/*.rb')).sort.each do |filename|
  require filename
end

, это будет работать для любых файлов .rb, если вы будете следовать шаблонуlib/ext/{library_related_to_patch}/{name_of_file_containing_monkeypatch}.rb

...