2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Devise】 ログイン失敗時の処理をカスタマイズ

Posted at

はじめに

現在カフェHPをRailsを用いて開発中です。管理者画面へのログイン機能をDeviseを用いて実装していく中で、Devise にデフォルトで設定されている挙動に苦しめられた為、Deviseのカスタマイズ方法を備忘録として残しておきます。

やりたいこと

ログイン画面ではヘッダーを表示させない。

現状

ログインフォーム未入力等でログイン失敗した際に、ログインページが再度読み込まれてヘッダーが表示される。

※ちなみにヘッダーはログイン画面で表示されないように以下の記述をしています。

views/layouts/application.html.erb
<header>
  <% unless current_page?(admin_session_path) %>
    <%= render "layouts/header-img" %>
    <%= render "layouts/nav" %>
    <%= render "layouts/burger"%>
  <% end %>
</header>

原因

どうやらDeviseはデフォルトのコントローラー設定により、ログイン認証に失敗すると、自動でsessionコントローラ内の別のアクションにリダイレクトする模様。

しかしターミナル上でログインボタンを押した際の挙動を確認してみるとCompleted 401 Unauthorizedのエラーが吐き出され、新規にログインページsessions#newを読み込んでおり、これが原因っぽい。

解決方法

やり方として正しいかはわからないが、sessions_controllercreateメソッドをカスタマイズして、リダイレクト先を指定することでヘッダーは表示されなくなった。

備忘録のため、以下にその際の手順を記載します。

【Devise】 createメソッドカスタマイズ方法

1. Deviseデフォルトの設定を受け継いだコントローラーを作成

まずはDeviseデフォルトのコントローラー設定を継承したカスタムコントローラーを作成していきます。

ターミナル
rails g devise:controllers admins
  • コントローラー名なので複数形にする

  • admins の部分は作成したモデル名
    一般ユーザーしかいないならusers

  • 作成されたファイルを確認。
    以下のファイルが作成されるので、カスタマイズしたいコントローラーを編集していきます。 今回はsessions#createをカスタムしたいのでsessions_controller.rbをイジっていきましょう。

ターミナル
create  app/controllers/admins/confirmations_controller.rb
create  app/controllers/admins/passwords_controller.rb
create  app/controllers/admins/registrations_controller.rb
create  app/controllers/admins/sessions_controller.rb
create  app/controllers/admins/unlocks_controller.rb
create  app/controllers/admins/omniauth_callbacks_controller.rb

2. routes.rbの修正

続いてカスタムコントローラーを読み込む為にroutes.rbを以下のようにします。

routes.rb
devise_for :admins, controllers: {
    sessions: "admins/sessions"
  }

3. createメソッドをカスタマイズ

ここからcreateメソッドをカスタマイズしていきますが、まずは分かりやすいようにDevise デフォルトの設定をコピペしてきます。

app/controllers/admins/sessions_controller.rb
def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message!(:notice, :signed_in)
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, location: after_sign_in_path_for(resource)
end

1行目に書かれている
self.resource = warden.authenticate!(auth_options)により、ログイン認証に失敗すると、自動でsessionコントローラ内の別のアクションにリダイレクトするようになっています。

デフォルトではnewに設定されていますが、今回は改めてリダイレクト先を設定してやりましょう。

書き換えるにはauth_optionsの設定値を書き換えてやる必要があります。
auth_options自体はDeviseのデフォルトコントローラに定義されていて、直接はさわれないため、オーバーライドしてやります。

app/controllers/admins/sessions_controller.rb
    def failed
        redirect_to new_admin_session_path
    end

protected

  def auth_options
    { scope: resource_name, recall: "#{controller_path}#failed" }
  end

failアクションを用意して、認証失敗時にはそちらにリダイレクトするようにしています。
これでログイン失敗時にもヘッダーが表示されることはなくなりました!

さいごに

今回はDeviseをカスタマイズすることで、とりあえずは表示に問題なくなりました。

しかしDeviseについては、まだまだ理解不足なところが多いため、デフォルトの挙動についても少しずつ理解していきたいと思います。

間違いなどがありましたらコメント頂けると嬉しいです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?