web-dev-qa-db-ja.com

ユーザーがdeviseでサインインできるようにする前に、ユーザーがアクティブかどうかを確認します(Rails)

私はdeviseを使用して、trueまたはfalseの:activeという名前のユーザーフィールドを作成しました。ユーザーにログインを許可する前に、ユーザーを手動でアクティブ(true)にする必要があります。少なくともそれが目的です。私はこれを試しました...

class SessionsController < Devise::SessionsController
  # POST /resource/sign_in
  def create
    "resource/signin CREATE"
    self.resource = warden.authenticate!(auth_options)
    unless resource.active?
      sign_out
      redirect_to :sorry_not_active_url
      return
    end
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in(resource_name, resource)
    respond_with resource, :location => after_sign_in_path_for(resource)
  end  
end

ただし、これは、ユーザーがログインできるすべての場所をキャッチするわけではありません。たとえば、ユーザーがパスワードを変更すると、サイトはその後自動的にログインします。ただし、ユーザーがアクティブでない場合は、ログインを許可せず、sorry_not_active_urlにリダイレクトするようにします。

ユーザーがアクティブでない場合、ユーザーがサインインできないようにする最善の方法は何ですか?

ありがとうございました。

36
user2012677

これら2つのメソッドをユーザーモデルに追加すると、deviseが自動的にそれらを取得するはずです。Devise::SessionsControllerを拡張する必要はありません。

def active_for_authentication?
  super && self.your_method_for_checking_active # i.e. super && self.is_active
end

def inactive_message
  "Sorry, this account has been deactivated."
end
86
house9

Devise(devise 3.2+を使用している場合)が block パラメータを(セッション)createでサポートするようになりました

# assuming this is your session controller

class SessionsController < Devise::SessionsController

def create
  super do |resource|
     unless resource.active?
      sign_out
      # you can set flash message as well.
      redirect_to :sorry_not_active_url
      return
    end
  end
end
6
Viren