Ruby on Railsでサービスオブジェクトを利用してログインができるようにしたいと考えています。Ruby on Railsを勉強して、現在9か月前後というのもあり、サービスオブジェクトを勉強したいということもあります。
ログインするためは、emailとpasswordが必要となるようにしています。emailはフォームオブジェクトを使用しています。(現在のところ、何も問題なし。)passwordはサービスオブジェクトを使用する予定です。ただし、サービスオブジェクトのコードを入力すると、下記画像のように、【BCrypt::Errors::InvalidHash in ・・・】のエラーが出てしまいます。大変申し訳ございませんが、解決策など教えていただけないでしょうか。
【環境】
Rails 5.1.7 gem 'bcrypt', '~> 3.1.7'
【migrate/create_support_members.rb】 class CreateSupportMembers < ActiveRecord::Migration[5.1] def change create_table :support_members do |t| t.string :lastname t.string :firstname t.string :lastname_kana t.string :firstname_kana t.string :email t.string :hashed_password t.boolean :suspended, default: false, null: false t.timestamps end end end
【model/support_members.rb】 before_save { self.email.downcase! } validates :lastname, presence: true, uniqueness: true validates :firstname, presence: true, uniqueness: true validates :lastname_kana, presence: true, uniqueness: true validates :firstname_kana, presence: true, uniqueness: true validates :email, presence: true,uniqueness: { case_sensitive: false }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i } validates :hashed_password, presence: true, length: { minimum: 6, maximum: 16 } # 下記でパスワードをハッシュ化する。 def password=(raw_password) if raw_password.kind_of?(String) self.hashed_password = BCrypt::Password.create(raw_password) elsif raw_password.nil? self.hashed_password = nil end end
【supporter/sessions_controller.rb】 def new if current_support_member redirect_to supporter_support_member_path(current_support_member) else @form = Supporter::LoginForm.new render :new end end def create # 下記はフォームオブジェクトを使用。 @form = Supporter::LoginForm.new(login_form_params) if @form.email.present? support_member = SupportMember.find_by('LOWER(email)= ?', @form.email.downcase) end # 下記はサービスオブジェクトを使用。 if Supporter::Authenticator.new(support_member).authenticate(@form.password) session[:support_member_id] = support_member.id flash.notice = 'ログインしました。' redirect_to supporter_support_member_path(current_support_member) else flash.now.alert = 'メールアドレスまたはパスワードが正しくありません。' render :new end end 以下省略・・・
【services/supporter/authenticater.rb】 class Supporter::Authenticator def initialize(support_member) @support_member = support_member end def authenticate(raw_password) @support_member && @support_member.hashed_password && BCrypt::Password.new(@support_member.hashed_password) == raw_password end end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。