213

これはかなり基本的な流れのようで、Laravel基本的なことに対する素晴らしい解決策がたくさんあるので、何かが足りないように感じます。

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

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

そうでない場合は、これを手動で実装した方がいらっしゃると思います。

4

25 に答える 25

250

Laravel5.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によって指摘された方法この方法:(私は彼の答えを更新しようとしましたが、彼は受け入れないようです)

認証フィルターの場合:

// 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以外のセッションでリダイレクトを設定することもでき、魔法のように機能します。

于 2013-03-13T18:11:46.773 に答える
96

Laravel> = 5.3

5.3でのAuthの変更により、これの実装が少し簡単になり、Authミドルウェアがサービスコンテナに移動されたため、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の違いについてはそれほど多くはなく、特にこの分野ではかなりの数があります。

于 2016-09-20T13:34:47.140 に答える
28

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

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

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

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

この方法は基本的に、アクセスしようとしたページを保存することであり、ログインページにリダイレクトされます。

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

return Redirect::intended();

最初にアクセスしようとしていたページにリダイレクトされます。

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

Redirect::back()

この素晴らしいブログをチェックすることができます。

于 2013-08-01T09:29:26.250 に答える
20

Redirect::intended関数を使用できます。オーセンティカトンフィルターに捕らえられる前に、ユーザーがアクセスしようとしていたURLにリダイレクトされます。目的の宛先が利用できない場合は、フォールバックURIをこのメソッドに指定できます。

ログイン/登録後:

return Redirect::intended('defaultpageafterlogin');
于 2013-06-17T08:54:02.660 に答える
14

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

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

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

ログインページの前のページにリダイレクトされます(2ページ前)。

于 2017-07-23T14:46:50.043 に答える
12

私はこれを言語セレクターコードでしばらく使用しています。1ページだけ戻る必要がある限り、正常に機能します。

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

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

于 2013-11-16T09:03:31.800 に答える
8
return Redirect::intended('/');

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

于 2015-02-21T12:11:23.823 に答える
6

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

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

また

return Redirect::intended('/');
于 2015-07-27T05:50:30.803 に答える
5

Laravel 3

(ViníciusFragosoPinheiro)コードを少し調整し、以下を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');
}
于 2013-05-31T22:52:11.550 に答える
4

Laravel8の場合

Laravel 8では、次のアプローチが有効です。

コントローラベースのアプローチ

/app/Http/Controllers/Auth/AuthenticatedSessionController.php

事前ログイン

目的のURLは、作成時にセッションに保存されます。

/**
 * Display the login view.
 *
 * @return \Illuminate\View\View
 */
public function create()
{
    session(['url.intended' => url()->previous()]);
    return view('auth.login');
}

ログイン後

ログインに成功したら、セッションで目的のURLが利用できる場合は、そのURLにリダイレクトします。それ以外の場合は、デフォルトのURLにリダイレクトします。

/**
 * Handle an incoming authentication request.
 *
 * @param  \App\Http\Requests\Auth\LoginRequest  $request
 * @return \Illuminate\Http\RedirectResponse
 */
public function store(LoginRequest $request)
{
    $request->authenticate();

    //in case intended url is available
    if (session()->has('url.intended')) {
        $redirectTo = session()->get('url.intended');
        session()->forget('url.intended');
    }

    $request->session()->regenerate();

    if ($redirectTo) {
        return redirect($redirectTo);
    }
    return redirect(RouteServiceProvider::HOME);
}
于 2021-04-30T11:39:15.167 に答える
3

使用するRedirect;

次に、これを使用します。

return Redirect::back();
于 2015-06-23T18:47:26.057 に答える
1

Laravel5.8では

App \ Http \ Controllers \ Auth \ LoginControllerに、次のメソッドを追加します

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

App \ Http \ Middleware\RedirectIfAuthenticatedで"returnredirect('/ home');"を次のように置き換えます

 if (Auth::guard($guard)->check()) 
    {
        return redirect()->intended();
    }
于 2020-04-16T07:37:20.877 に答える
0

Laravel5.5およびおそらく5.4の場合

App \ Http \ Middleware \ RedirectIfAuthenticatedで、handle関数を次のように変更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 \ LoginControllershowLoginForm()、次のように関数を作成します。

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

このように、別のページの意図があった場合はそこにリダイレクトされ、そうでない場合はホームにリダイレクトされます。

于 2018-01-11T13:22:27.393 に答える
0

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

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

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

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

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

public function __construct()
{
    $this->middleware(['auth', '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

于 2019-05-05T22:12:20.457 に答える
0

axiosまたはその他のAJAXjavascriptライブラリを使用している場合は、URLを取得してフロントエンドに渡すことができます。

あなたは以下のコードでそれを行うことができます

   $default = '/';

   $location = $request->session()->pull('url.intended', $default);

    return ['status' => 200, 'location' => $location];

これはjson形式の文字列を返します

于 2020-02-08T11:37:10.960 に答える
-1

これをroutes.phpで試しましたか?

Route::group(['middleware' => ['web']], function () {
    //
    Route::get('/','HomeController@index');
});
于 2016-01-16T15:28:41.597 に答える
-1
       // Also place this code into base controller in contract function,            because ever controller extends base  controller
 if(Auth::id) {
  //here redirect your code or function
 }
if (Auth::guest()) {
       return Redirect::guest('login');
}
于 2016-02-20T18:32:59.773 に答える
-1

これが5.1の私の解決策です。誰かが投稿の「いいね」ボタンをクリックし、ログインにリダイレクトされてから、元のページに戻る必要がありました。それらがすでにログインしている場合href、「いいね」ボタンのはJavaScriptでインターセプトされ、AJAXリクエストに変換されました。

ボタンはのようなもの<a href="/like/931">Like This Post!</a>です。/like/931ミドルウェアを必要とするLikeControllerによって処理されauthます。

Authenticateミドルウェア(handle()関数)で、最初に次のようなものを追加します。

    if(!str_contains($request->session()->previousUrl(), "/auth/login")) {
        $request->session()->put('redirectURL', $request->session()->previousUrl());
        $request->session()->save();
    }

ログイン用のURLに変更/auth/loginします。このコードは、URLがログインURLでない限り、元のページのURLをセッションに保存します。このミドルウェアが2回呼び出されたように見えるため、これが必要です。なぜか、それが本当かどうかはわかりません。しかし、その条件をチェックしないと、それは正しい元のページと等しくなり、それからどういうわけかにチャンスがあり/auth/loginます。これを行うには、おそらくもっとエレガントな方法があります。

次に、LikeController元のページで押されたボタンのURLを処理する、またはその他のコントローラーで、次のようにします。

//some code here that adds a like to the database
//...
return redirect($request->session()->get('redirectURL'));

このメソッドは非常にシンプルで、既存の関数をオーバーライドする必要がなく、うまく機能します。Laravelがこれを行うためのより簡単な方法がある可能性はありますが、それが何であるかはわかりません。LikeControllerは、以前のURLが何にリダイレクトされるかを知る必要があるため、この関数の使用はintended()私の場合は機能しません。本質的に2つのレベルの逆方向。

于 2016-02-24T20:35:46.413 に答える
-1

Laravel 5.2の場合(以前は使用していませんでした)

コードをファイルapp\Http \ Controllers \ Auth\AurhController.phpに貼り付けます

   /**
 * Overrides method in class 'AuthenticatesUsers'
 *
 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
 */
public function showLoginForm()
{
    $view = property_exists($this, 'loginView')
        ? $this->loginView : 'auth.authenticate';
    if (view()->exists($view)) {
        return view($view);
    }
    /**
     * seve the previous page in the session
     */
    $previous_url = Session::get('_previous.url');
    $ref = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
    $ref = rtrim($ref, '/');
    if ($previous_url != url('login')) {
        Session::put('referrer', $ref);
        if ($previous_url == $ref) {
            Session::put('url.intended', $ref);
        }
    }
    /**
     * seve the previous page in the session
     * end
     */
    return view('auth.login');
}
/**
 * Overrides method in class 'AuthenticatesUsers'
 *
 * @param Request $request
 * @param $throttles
 *
 * @return \Illuminate\Http\RedirectResponse
 */
protected function handleUserWasAuthenticated(Request $request, $throttles)
{
    if ($throttles) {
        $this->clearLoginAttempts($request);
    }
    if (method_exists($this, 'authenticated')) {
        return $this->authenticated($request, Auth::guard($this->getGuard())->user());
    }
    /*return to the previous page*/
    return redirect()->intended(Session::pull('referrer'));
    /*return redirect()->intended($this->redirectPath()); /*Larevel default*/
}

そして名前空間をインポートします:use Session;

ファイルapp\Http \ Controllers \ Auth \ AurhController.phpに変更を加えていない場合は、GitHubのファイルに置き換えることができます。

于 2016-06-15T13:56:02.597 に答える
-1

Laravel 5.2

管理ミドルウェアなどの別のミドルウェアを使用している場合は、次を使用してurl.intendedのセッションを設定できます。

基本的に\Session::put('url.intended', \URL::full());、リダイレクトを手動で設定する必要があります。

  if (\Auth::guard($guard)->guest()) {
      if ($request->ajax() || $request->wantsJson()) {
         return response('Unauthorized.', 401);
      } else {
        \Session::put('url.intended', \URL::full());
        return redirect('login');
      }
  }

ログイン試行時

ログイン試行時に必ず使用してくださいreturn \Redirect::intended('default_path');

于 2016-08-16T05:30:24.450 に答える
-1

Larvel 5.3 これは、LoginController.phpを更新するだけで実際に機能しました

 use Illuminate\Support\Facades\Session;
 use Illuminate\Support\Facades\URL;


public function __construct()
{
    $this->middleware('guest', ['except' => 'logout']);
    Session::set('backUrl', URL::previous());
}


public function redirectTo()
{
    return Session::get('backUrl') ? Session::get('backUrl') :   $this->redirectTo;
}

参照:https ://laracasts.com/discuss/channels/laravel/redirect-to-previous-page-after-login

于 2017-05-12T14:37:03.960 に答える
-1

Laravel 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');

于 2018-10-30T12:21:20.690 に答える
-1

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

  • ミドルウェアの内部

    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);
        }
    
于 2019-02-01T17:18:10.030 に答える
-1

まず、ユーザーを「ログイン」ルートにリダイレクトする方法を知っておく必要があります。

return redirect()->guest('/signin');

このようではありません:

return redirect()->intended('/signin');
于 2020-01-09T15:22:04.880 に答える
-1

これはlaravel8で私のために働いた:

これをLoginController.phpに追加します。

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

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

2回リダイレクトされるので、ログイン前のページにリダイレクトされます。

クレジットは@MevlütÖzdemirに答えを求めて行きます!

于 2020-10-09T15:32:24.650 に答える