devise(warden)でログイン時にメールアドレス、パスワード以外の条件を追加する

devise(warden)でログイン時にメールアドレス、パスワード以外の条件を追加する

日記帳です。

deviseでメールアドレスとパスワード以外に
ユーザー資格(@user.qualification)があるユーザーという条件を加えてログインさせたい場合

# config/initializer/devise.rb
Devise.setup do |config|
  # 中略
  config.warden do |manager|
    manager.default_strategies(scope: :user).unshift :login_with_qualification # 追加するstrategy名
  end
end
# config/initializer/warden_strategy.rb
Warden::Strategies.add(:login_with_qualification) do
  # このstrategyを適用するかどうか
  def valid?
    params['user'].present?
  end

  # 認証
  def authenticate!
    user = User.find_by(email: params['user']['email'])
    if user.nil? || !user.valid_password?(params['user']['password'])
      return nil
    elsif user.qualification.unavailable? # ユーザー資格停止中
      fail!('現在ユーザー資格が停止されています。')
    end
  end
end

wardenのwiki(https://github.com/hassox/warden/wiki/Strategies)等ではsuccess!を呼んで認証させていますが、success!が呼ばれるとその時点で認証が成功と見なされるためここでは呼んでいません。
メールアドレスとパスワードはデフォルトのstrategyでチェックされるのでfail!のみを呼んでいます。

TAG

  • このエントリーをはてなブックマークに追加
kurashita
エンジニア kurashita kurashita

基本的にRuby on Railsで開発してます。最近はvue.jsも。好きな塔は円城です。