web-dev-qa-db-ja.com

Laravelログイン後に元の宛先にリダイレクトする

これは非常に基本的なフローのように思え、Laravelには基本的なことに対するニースのソリューションが非常に多くあり、何かが足りないように感じます。

ユーザーが認証を必要とするリンクをクリックします。 Laravelのauthフィルターが起動し、ログインページにルーティングします。ユーザーはログインし、「auth」フィルターが有効になる前にアクセスしようとしていた元のページに移動します。

元々どのページにアクセスしようとしていたかを知る良い方法はありますか? Laravelはリクエストをインターセプトするものであるため、ユーザーがログインした後にルーティングを容易にするためにどこかを追跡するかどうかは知りませんでした。

そうでない場合、私はあなたの何人かがこれを手動で実装した方法を聞きたいです。

165
JOV

Laravel 5.3以降の場合

スコットの答え 以下を確認してください。

Laravel 5から5.2まで

簡単に言えば、

認証ミドルウェアの場合:

// redirect the user to "/login"
// and stores the url being accessed on session
if (Auth::guest()) {
    return redirect()->guest('login');
}
return $next($request);

ログインアクションの場合:

// redirect the user back to the intended page
// or defaultpage if there isn't one
if (Auth::attempt(['email' => $email, 'password' => $password])) {
    return redirect()->intended('defaultpage');
}

Laravel 4の場合(古い回答)

この回答の時点では、フレームワーク自体からの公式のサポートはありませんでした。最近では使用できます 以下のbgdrlが指摘するメソッド このメソッド:(私は彼の答えを更新しようとしましたが、彼は受け入れないようです)

認証フィルター:

// redirect the user to "/login"
// and stores the url being accessed on session
Route::filter('auth', function() {
    if (Auth::guest()) {
        return Redirect::guest('login');
    }
});

ログインアクションの場合:

// redirect the user back to the intended page
// or defaultpage if there isn't one
if (Auth::attempt(['email' => $email, 'password' => $password])) {
    return Redirect::intended('defaultpage');
}

Laravel 3の場合(さらに古い回答)

次のように実装できます。

Route::filter('auth', function() {
    // If there's no user authenticated session
    if (Auth::guest()) {
        // Stores current url on session and redirect to login page
        Session::put('redirect', URL::full());
        return Redirect::to('/login');
    }
    if ($redirect = Session::get('redirect')) {
        Session::forget('redirect');
        return Redirect::to($redirect);
    }
});
// on controller
public function get_login()
{
    $this->layout->nest('content', 'auth.login'); 
}

public function post_login()
{
    $credentials = [
        'username' => Input::get('email'),
        'password' => Input::get('password')
    ];

    if (Auth::attempt($credentials)) {
        return Redirect::to('logged_in_homepage_here');
    }

    return Redirect::to('login')->with_input();
}

セッションにリダイレクトを保存すると、ユーザーが資格情報の入力を間違えたり、アカウントを持っていないためにサインアップする必要がある場合でも、リダイレクトを保持できるという利点があります。

これにより、Auth以外にセッションでリダイレクトを設定することも可能になり、魔法のように動作します。

218
vFragosop

Laravel> = 5.3

5.3での認証の変更により、この実装は少し簡単になり、認証ミドルウェアがサービスコンテナに移動されたため、5.2とは少し異なります。

新しいミドルウェア認証リダイレクタを変更します

/app/Http/Middleware/RedirectIfAuthenticated.php

ハンドル関数を少し変更して、次のようにします。

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
        return redirect()->intended('/home');
    }

    return $next($request);
}

TL; DRの説明

唯一の違いは4行目です。デフォルトでは次のようになります。

return redirect("/home");

Laravel> = 5.3は、Auth Guardのチェック時に最後の「意図した」ルートを自動的に保存するため、次のように変更されます。

return redirect()->intended('/home');

これはLaravelに、ログイン前に最後に意図したページにリダイレクトするよう指示します。そうでない場合は、「/ home」またはデフォルトでそれらを送信したい場所に移動します。

これが他の誰かの助けになることを願っています-5.2と5.3の違いについてはそれほど多くはありません。特にこの分野ではかなりの数があります。

55
Scott Byers

私はあなたにとって非常に役立つかもしれないこれらの2つの素晴らしい方法を見つけました。

Redirect::guest();
Redirect::intended();

このフィルターは、認証が必要なルートに適用できます。

Route::filter('auth', function()
{
    if (Auth::guest()) {
           return Redirect::guest('login');
    }
});

このメソッドが基本的に行うことは、アクセスしようとしたページを保存することであり、loginページにリダイレクトされます。

ユーザーが認証されたら、電話をかけることができます

return Redirect::intended();

そして、最初に到達しようとしていたページにリダイレクトされます。

私は通常以下の方法を使用しますが、それを行うには素晴らしい方法です。

Redirect::back()

this 素晴らしいブログを確認できます。

25

Redirect :: intended関数を使用できます。認証フィルターでキャッチされる前にアクセスしようとしたURLにユーザーをリダイレクトします。目的の宛先が利用できない場合に、このメソッドにフォールバックURIを与えることができます。

ログイン/登録後:

return Redirect::intended('defaultpageafterlogin');
20
dabuno

私はこれをしばらくの間、言語選択コードで使用しています。 1ページだけ戻る必要がある限り、問題なく動作します。

return Redirect::to(URL::previous());

これは、最も強力なソリューションではありませんが、非常に簡単であり、いくつかのパズルの解決に役立ちます。 :)

11
Federico Stango
return Redirect::intended('/');

これにより、プロジェクトのデフォルトページ、つまり開始ページにリダイレクトされます。

8
Parag Bhingre

LoginControllersコンストラクターを次のように変更します。

public function __construct()
    {
        session(['url.intended' => url()->previous()]);
        $this->redirectTo = session()->get('url.intended');

        $this->middleware('guest')->except('logout');
    }

ログインページの前のページに戻ります(2ページ前)。

8
MevlütÖzdemir

laravel 5. *の場合は、これらを試してください。

return redirect()->intended('/');

または

return Redirect::intended('/');
6

Laravel 3

(ViníciusFragoso Pinheiro)コードを少し調整し、filters.phpに以下を配置しました

Route::filter('auth', function()
{
    // If there's no user authenticated session
    if (Auth::guest()) {
        // Flash current url to session and redirect to login page
        Session::flash('redirect', URL::full());
        return Redirect::guest('login');
    }
});

そして、私のAuthController.php内で:

// Try to log the user in.
if (Auth::attempt($userdata)) {

    if ($redirect = Session::get('redirect')) {
        return Redirect::to($redirect);
    } else {
        // Redirect to homepage
        return Redirect::to('your_default_logged_in_page')->with('success', 'You have logged in successfully');
    }
} else {
    // Reflash the session data in case we are in the middle of a redirect 
    Session::reflash('redirect');

    // Redirect to the login page.
    return Redirect::to('login')->withErrors(['password' => 'Password invalid'])->withInput(Input::except('password'));
}

認証の問題がある場合、'redirect'セッションデータが再フラッシュされることに注意してください。これにより、ログインの失敗時にリダイレクトがそのまま保持されますが、ユーザーが任意の時点でクリックする場合、次のログインプロセスはセッションデータによって中断されません。

また、AuthControllerにログインフォームを表示する時点でデータを再フラッシュする必要があります。そうしないと、チェーンが破損します。

public function showLogin()
{
    // Reflash the session data in case we are in the middle of a redirect 
    Session::reflash('redirect');

    // Show the login page
    return View::make('auth/login');
}
5
Joe Richards

Redirect;を使用

次にこれを使用します:

return Redirect::back();
3
ujwal dhakal

Laravel 5.5およびおそらく5.4

App\Http\Middleware\RedirectIfAuthenticatedで、ハンドル関数のredirect('/home')redirect()->intended('/home')に変更します。

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
        return redirect()->intended('/home');
    }

    return $next($request);
}

App\Http\Controllers\Auth\LoginController以下のようにshowLoginForm()関数を作成します。

public function showLoginForm()
{
    if(!session()->has('url.intended'))
    {
        session(['url.intended' => url()->previous()]);
    }
    return view('auth.login');
}

この方法は、別のページにインテントがあった場合、そこにリダイレクトし、そうでなければホームにリダイレクトします。

0
DerDare

Laravle 5.7の場合、次の変更を行う必要があります。

ミドルウェア> RedirectIfAuthenticated.php

これを変更:

public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/admin');
        }

        return $next($request);
    }

これに:

public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/yourpath');
        }

        return $next($request);
    }

return redirect( '/ yourpath');

0
Prince Ahmed

Laravelはすぐにこの機能をサポートするようになりました!(5.5以前から信じています)。

以下に示すように、Controller__construct()メソッドを追加します。

public function __construct()
{
    $this->middleware('auth');
}

ログイン後、ユーザーは最初にアクセスする予定のページにリダイレクトされます。

アプリケーションロジックの必要に応じて、Laravelのメール検証機能を追加することもできます。

public function __construct()
{
    $this->middleware('auth');
    $this->middleware('verified');
}

ドキュメントには、非常に簡単な例が含まれています。

ボーナス:exceptまたはonlyオプションを使用して、ミドルウェアが適用されるコントローラーのメソッドを選択することもできます。

exceptの例:

public function __construct()
{
    $this->middleware('auth', ['except' => ['index', 'show']]);
}

onlyの例:

public function __construct()
{
    $this->middleware('auth', ['only' => ['index', 'show']]);
}

exceptおよびonlyミドルウェアオプションの詳細:

0
LobsterBaz

Laravel 5.7のカスタムログインコントローラーとミドルウェアで次のアプローチを使用していますが、laravel 5バージョンのいずれでも動作することを望みます

  • ミドルウェアの中

    if (Auth::check()){
        return $next($request);
    }
    else{
      return redirect()->guest(route('login'));
    }
    
  • 内部コントローラログインメソッド

    if (Auth::attempt(['email' => $email, 'password' => $password])) {
    return redirect()->intended('/default');
    }
    
  • 意図したURLをクライアント側に渡す必要がある場合は、次を試してください。

       if (Auth::attempt(['username' => $request->username, 'password' => $request->password])) {
           $intended_url= redirect()->intended('/default')->getTargetUrl();
           $response = array(
          'status' => 'success',
          'redirectUrl' => $intended_url,
          'message' => 'Login successful.you will be redirected to home..', );
          return response()->json($response);
        } else {
            $response = array(
          'status' => 'failed',
          'message' => 'username or password is incorrect', );
         return response()->json($response);
        }
    
0
Nayeem Azad