1. ホーム
  2. ララベル

[解決済み】Laravel ログイン後、元の宛先にリダイレクトする。

2022-04-17 01:51:20

質問

これはかなり基本的な流れのように思えますし Laravel には基本的なことについての素晴らしいソリューションがたくさんあるので、何か足りないような気がするんです。

ユーザーが認証を必要とするリンクをクリックした場合。 Laravelの オート フィルターが作動し、ログインページにルーティングされる。 ユーザーはログインした後、「auth」フィルターが作動する前にアクセスしようとした元のページに移動します。

元々どのページにアクセスしようとしていたのかを知る良い方法はないでしょうか? Laravelはリクエストをインターセプトするものなので、ユーザーがログインした後に簡単にルーティングできるように、どこかに記録を残しているかどうかはわかりませんでした。

もしそうでなければ、手動でどのように実装された方がいらっしゃるか、お聞きしたいです。

どのように解決するのですか?

Laravel 5.3以上の場合

確認 スコットの回答 の下にあります。

Laravel5から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氏が指摘した方法は以下の通りです。 という方法があります。 (彼の回答を更新してみましたが、受け入れてもらえないようです)

Authフィルターについて。

// 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');
}

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

このように実装することができます。

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();
}

リダイレクトをSessionに保存することで、ユーザーが認証情報を打ち間違えた場合や、アカウントを持っておらずサインアップしなければならない場合でも、リダイレクトを持続させることができるという利点があります。

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