it-swarm.com.de

Laravel-Weiterleitung nach dem Einloggen zum ursprünglichen Ziel

Dies scheint ein ziemlich grundlegender Fluss zu sein, und Laravel hat so viele Nice-Lösungen für grundlegende Dinge, dass ich das Gefühl habe, dass mir etwas fehlt.

Ein Benutzer klickt auf einen Link, der eine Authentifizierung erfordert. Der auth - Filter von Laravel startet und leitet sie an eine Anmeldeseite weiter. Der Benutzer meldet sich an und wechselt dann zur Originalseite, zu der er gelangen wollte, bevor der 'auth'-Filter aktiviert wurde.

Gibt es eine gute Möglichkeit zu wissen, auf welche Seite sie ursprünglich gelangen wollten? Da Laravel die Anfrage abfängt, wusste ich nicht, ob sie nach dem Einloggen des Benutzers irgendwo nach dem einfachen Routing verfolgt wird.

Wenn nicht, wäre ich neugierig, wie einige von Ihnen dies manuell umgesetzt haben.

157
JOV

Für Laravel 5.3 und höher

Check Scotts Antwort unten.

Für Laravel 5 bis 5.2

Einfach gesagt,

Auf auth Middleware:

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

Bei der Anmeldung:

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

Für Laravel 4 (alte Antwort)

Zum Zeitpunkt dieser Antwort gab es keine offizielle Unterstützung durch das Framework selbst. Heutzutage können Sie verwenden die von bgdrl unten aufgeführte Methode diese Methode: (Ich habe versucht, seine Antwort zu aktualisieren, aber er scheint nicht zu akzeptieren)

Beim Auth-Filter:

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

Bei der Anmeldung:

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

Für Laravel 3 (noch ältere Antwort)

Sie könnten es so implementieren:

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

Das Speichern der Umleitung in einer Sitzung hat den Vorteil, dass sie auch dann beibehalten wird, wenn der Benutzer seine Anmeldeinformationen falsch eingegeben hat oder er kein Konto hat und sich anmelden muss.

Dies ermöglicht auch, dass außer Auth eine Weiterleitung für die Sitzung festgelegt wird, und es funktioniert magisch.

215
vFragosop

Laravel> = 5,3

Die Auth-Änderungen in 5.3 machen die Implementierung etwas einfacher und etwas anders als 5.2, da die Auth-Middleware in den Service-Container verschoben wurde.

Ändern Sie den neuen Middleware-Auth-Redirector

/app/Http/Middleware/RedirectIfAuthenticated.php

Ändern Sie die Grifffunktion etwas, so dass es so aussieht:

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

    return $next($request);
}

TL; DR-Erklärung

Der einzige Unterschied besteht in der 4. Zeile; Standardmäßig sieht es so aus:

return redirect("/home");

Da Laravel> = 5.3 beim Prüfen des Auth Guard automatisch die letzte "beabsichtigte" Route speichert, ändert sich diese in:

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

Dadurch wird Laravel angewiesen, vor dem Login auf die letzte gewünschte Seite umzuleiten. Andernfalls gehen Sie zu "/ home" oder dorthin, wo Sie sie standardmäßig senden möchten.

Ich hoffe, das hilft jemandem - es gibt nicht viel Unterschiede zwischen 5.2 und 5.3, und in diesem Bereich gibt es einige.

52
Scott Byers

Ich fand diese beiden großartigen Methoden, die für Sie äußerst hilfreich sein könnten.

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

Sie können diesen Filter auf die Routen anwenden, für die eine Authentifizierung erforderlich ist.

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

Diese Methode dient im Wesentlichen zum Speichern der Seite, die Sie besuchen wollten, und leitet Sie zur Seite login weiter.

Wenn der Benutzer authentifiziert ist, können Sie anrufen

return Redirect::intended();

und es leitet Sie zu der Seite weiter, die Sie zuerst erreichen wollten.

Es ist eine großartige Möglichkeit, dies zu tun, obwohl ich normalerweise die unten stehende Methode verwende.

Redirect::back()

Sie können dieses großartiger Blog überprüfen.

25

Sie können die Funktion Redirect :: purpose verwenden. Der Benutzer wird auf die URL umgeleitet, auf die er zugreifen wollte, bevor er vom Authentifizierungsfilter abgefangen wird. Ein Fallback-URI kann für diese Methode angegeben werden, falls das beabsichtigte Ziel nicht verfügbar ist.

In post anmelden/registrieren:

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

Ich verwende dies seit einiger Zeit für meinen Sprachauswahlcode. Solange Sie nur eine Seite zurückgehen müssen, funktioniert das einwandfrei:

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

Es ist nicht die leistungsfähigste Lösung, aber es ist sehr einfach und kann helfen, ein paar Rätsel zu lösen. :)

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

dadurch werden Sie auf die Standardseite Ihres Projekts, d.

8
Parag Bhingre

Ändern Sie Ihren LoginControllers-Konstruktor in:

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

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

Sie werden vor der Anmeldeseite (2 Seiten zurück) zur Seite zurückgeleitet.

7
MevlütÖzdemir

Für Laravel 5. * probieren Sie diese.

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

oder 

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

Laravel 3

Ich habe Ihren (Vinícius Fragoso Pinheiro) -Code leicht angepasst und den folgenden Code in die filters.php eingefügt

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

Und dann in meiner 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'));
}

Beachten Sie, dass die 'redirect'-Sitzungsdaten bei einem Authentifizierungsproblem umgeflasht werden. Dadurch bleibt die Weiterleitung während eines Anmeldeproblems erhalten. Wenn der Benutzer jedoch an einem beliebigen Punkt aufhört, wird der nächste Anmeldeprozess nicht durch die Sitzungsdaten unterbrochen.

Sie müssen auch die Daten umflammen, sobald das Anmeldeformular in Ihrer AuthController angezeigt wird. Andernfalls ist die Kette unterbrochen:

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

Verwenden Sie Redirect;

Dann benutze folgendes:

return Redirect::back();
3
ujwal dhakal

Für Laravel 5.5 und wahrscheinlich 5.4

In App\Http\Middleware\RedirectIfAuthenticated redirect('/home') in redirect()->intended('/home') der Handle-Funktion ändern:

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

    return $next($request);
}

in App\Http\Controllers\Auth\LoginController Erstellen Sie die Funktion showLoginForm() wie folgt:

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

Wenn auf einer anderen Seite eine Absicht vorhanden war, wird sie dorthin umgeleitet, ansonsten nach Hause.

0
DerDare

Für Laravle 5.7 müssen Sie Folgendes ändern: 

Middleware> RedirectIfAuthenticated.php

Ändere das:

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

        return $next($request);
    }

Zu diesem:

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

        return $next($request);
    }

Rückleitung umleiten ('/ yourpath');

0
Prince Ahmed

Laravel unterstützt diese Funktion jetzt sofort! (Ich glaube seit 5.5 oder früher).

Fügen Sie eine __construct() -Methode zu Ihrem Controller hinzu, wie unten gezeigt:

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

Nach der Anmeldung werden Ihre Benutzer zu der Seite weitergeleitet, die sie ursprünglich besuchen wollten.

Sie können Laravels E-Mail-Überprüfungsfunktion auch entsprechend Ihrer Anwendungslogik hinzufügen:

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

Die Dokumentation enthält ein sehr kurzes Beispiel:

Bonus: Mit den Optionen except oder only kann auch ausgewählt werden, auf welche Controller-Methoden die Middleware angewendet werden soll.

Beispiel mit except:

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

Beispiel mit only:

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

Weitere Informationen zu den Middleware-Optionen except und only:

0
LobsterBaz

Ich verwende den folgenden Ansatz mit einem benutzerdefinierten Login-Controller und einer Middleware für Laravel 5.7, aber ich hoffe, dass dies in allen Laravel 5-Versionen funktioniert

  • in Middleware

    if (Auth::check()){
        return $next($request);
    }
    else{
      return redirect()->guest(route('login'));
    }
    
  • anmeldemethode innerhalb des Controllers

    if (Auth::attempt(['email' => $email, 'password' => $password])) {
    return redirect()->intended('/default');
    }
    
  • Wenn Sie die beabsichtigte URL an client side übergeben müssen, können Sie Folgendes versuchen 

       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