web-dev-qa-db-ja.com

ユーザーがDeviseで認証されていない場合にログインページにリダイレクトする

DeviseをRuby on Railsで使用しています。

認証が必要なユーザーが認証を必要とするページにアクセスしようとする場合に、認証されていないユーザーをsessions#newページにリダイレクトする推奨方法は何ですか?

現在、アクセスしようとするルートに一致するルートがないことを示すエラーが表示されます(本番環境で404エラーが発生します)。

25
Gdeglin

このメソッドをapplication_controller.rbに追加するだけです

  protected
  def authenticate_user!
    if user_signed_in?
      super
    else
      redirect_to login_path, :notice => 'if you want to add a notice'
      ## if you want render 404 page
      ## render :file => File.join(Rails.root, 'public/404'), :formats => [:html], :status => 404, :layout => false
    end
  end

そして、before_filter別のコントローラーでこのメソッドを呼び出すことができます。

例:

class HomesController < ApplicationController
  before_filter :authenticate_user!
  ## if you want spesific action for require authentication
  ## before_filter :authenticate_user!, :only => [:action1, :action2]
end

login_pathroutes.rbに追加することを忘れないでください

devise_scope :user do
  match '/sign-in' => "devise/sessions#new", :as => :login
end

注:アプリ認証用のデバイスを使用するときは常にこの方法を使用します。(Rails 3.2およびRails 4.0.1)

63
GeekToL

GeekTolが書いたように、または単に置くことができます

before_action :authenticate_user!

コントローラーで。

この場合、deviseはデフォルトのauthenticate_user!を使用します。メソッド。「user_session_path」にリダイレクトし、デフォルトのフラッシュメッセージを使用します。

Authenticate_userを書き換える必要はありません!カスタマイズする場合を除き、メソッド。

20
leandrotk

私はあなたが単に追加できると思った:before_action:authenticate_user!ユーザーのログインが必要な各コントローラーに。

私はRails初心者ですが、自分の検索でこれを見つけ、アプリケーションでうまく機能します。

3
comphelp

Devise独自のHow To: How To:ユーザーが認証できない場合に特定のページにリダイレクトする を参照する必要があります。

私が考えることができる別の選択肢は、保護されたルートをラップするルーティング制約を作成することです。 Deviseの方法に固執する方が良いでしょうが、以下に例を示します。

#On your routes.rb
constraints(Constraints::LoginRequired) do
  get '/example' 
end

#Somewhere like lib/constraints/login_required.rb
module Constraints
  class LoginRequired
    def self.matches?(request)
      #some devise code that checks if the user is logged in
    end 
  end
end
1
Lucas Polonio