Laravel giriş yaptıktan sonra orijinal varış yerine yeniden yönlendiriyor


189

Bu oldukça basit bir akış gibi görünüyor ve Laraveltemel şeyler için çok güzel çözümler var, bir şeyleri özlüyor gibi hissediyorum.

Kullanıcı, kimlik doğrulaması gerektiren bir bağlantıyı tıklatır. Laravel'in kimlik doğrulama filtresi devreye girer ve bunları bir giriş sayfasına yönlendirir. Kullanıcı oturum açar, ardından 'kimlik doğrulama' filtresi devreye girmeden önce ulaşmaya çalıştığı orijinal sayfaya gider.

Başlangıçta hangi sayfaya ulaşmaya çalıştıklarını bilmenin iyi bir yolu var mı? Laravel isteği kesen biri olduğundan, kullanıcı oturum açtıktan sonra kolay yönlendirme için bir yerde olup olmadığını bilmiyordum.

Değilse, bazılarınızın bunu manuel olarak nasıl uyguladığını duymak isterim.

Yanıtlar:


234

Laravel 5.3 ve üstü için

Scott'ın cevabını aşağıdan kontrol edin .

Laravel 5 için 5.2'ye kadar

Basit ifadeyle,

Yetkilendirme katmanında:

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

Giriş yapıldığında:

// 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 için (eski cevap)

Bu cevap sırasında çerçevenin kendisinden resmi bir destek yoktu. Bugünlerdeaşağıda bgdrl ile gösterilen yöntemBu yöntem: (Cevabını güncellemeyi denedim, ama kabul etmeyecek gibi görünüyor)

Yetkilendirme filtresinde:

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

Giriş yapıldığında:

// 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 için (hatta daha eski bir cevap)

Bunu şu şekilde uygulayabilirsiniz:

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

Oturumdaki yeniden yönlendirmeyi depolamak, kullanıcı kimlik bilgilerini yazmasa veya bir hesabı yoksa ve kaydolmak zorunda olsa bile, devam ettirmenin yararına sahiptir.

Bu aynı zamanda Auth dışında her şeyin oturumda bir yönlendirme ayarlamasına izin verir ve sihirli bir şekilde çalışır.


Oturumu unutmak yerine unutmak daha anlamlı olmaz mıydı? Giriş işleminiz yalnızca varsa oturumdaki değere veya varsayılan sayfaya bir yönlendirme döndürür.
bilalq

2
Bunun neden flaştan daha iyi olduğunu açıklamak için cevabı düzenledim.
vFragosop

Mantıklı. Her seferinde yeniden ateşlemekten daha iyi.
bilalq

1
Auth :: attempt () geçtiğinde, kullanıcıyı varsayılan sayfaya (genellikle evine) yönlendirebilirsiniz. Bu yeniden yönlendirme bu filtreden tekrar geçer ve varsa, istenen orijinal URL'ye yönlendirir. Aksi takdirde, sadece evini oluşturmaya devam edecektir. Bir giriş eylemi örneği vereceğim.
vFragosop

1
5.1'de orirware RedirectIfAuthenticated.php: if ($ this-> auth-> check ()) {return redirect ('/ privatepage'); }
Dave Driesmans

73

Laravel> = 5.3

5.3'teki Auth değişiklikleri, Auth Middleware hizmet konteynerine taşındığından bunun uygulanmasını biraz daha kolay ve 5.2'den biraz farklı kılar.

Yeni Middleware kimlik doğrulaması yeniden yönlendiricisini değiştirme

/app/Http/Middleware/RedirectIfAuthenticated.php

Kol işlevini biraz değiştirin, böylece şöyle görünür:

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

    return $next($request);
}

TL; DR açıklaması

Tek fark 4. satırda; varsayılan olarak şöyle görünür:

return redirect("/home");

Laravel> = 5.3, Auth Guard'ı kontrol ederken otomatik olarak son "amaçlanan" rotayı kaydettiğinden şu şekilde değişir:

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

Bu Laravel'e giriş yapmadan önce istenen son sayfaya yönlendirmesini söyler, aksi takdirde "/ home" ya da varsayılan olarak göndermek istediğiniz yere gidin.

Umarım bu başka birine yardımcı olur - 5.2 ve 5.3 arasındaki farklar hakkında çok fazla şey yoktur ve bu alanda özellikle birkaç tane vardır.


2
Laravel 6.4 için bu artık çalışmıyor ... herhangi bir fikir pls?
alex toader

return redirect()->intended(RouteServiceProvider::HOME);Ev yolunuzu tek bir yerde tutmak için kullanırım .
Mateusz

26

Size çok yardımcı olabilecek iki harika yöntem buldum.

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

Bu filtreyi, kimlik doğrulaması gerektiren rotalara uygulayabilirsiniz.

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

Bu yöntemin temel olarak, ziyaret etmeye çalıştığınız sayfayı saklamaktır ve sizi giriş sayfasına yönlendirir .

Kullanıcının kimliği doğrulandığında şunu arayabilirsiniz:

return Redirect::intended();

sizi ilk başta ulaşmaya çalıştığınız sayfaya yönlendirir.

Genellikle aşağıdaki yöntemi kullanmama rağmen bunu yapmanın harika bir yolu.

Redirect::back()

Bu harika blogu kontrol edebilirsiniz .


Bu, yukarıdaki çözümlerden çok daha iyi. Yukarıdaki çözümler, 4.1 ile yapamadığım giriş işlevine bir kapatma geçirebilmeyi gerektirir. Ama bu çok daha basitti ve olduğu gibi çalıştı.
user2662680

20

Redirect :: amaçlanan işlevi kullanabilirsiniz . Kimlik doğrulama filtresi tarafından yakalanmadan önce kullanıcıyı erişmeye çalıştıkları URL'ye yönlendirir. Amaçlanan hedefin mevcut olmaması durumunda bu yönteme bir geri dönüş URI'si verilebilir.

Giriş / kayıt sonrası:

return Redirect::intended('defaultpageafterlogin');

11

Bir süredir dil seçim kodumda kullanıyorum. Sadece 1 sayfa geri gitmeniz gerektiği sürece iyi çalışır:

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

Buradaki en güçlü çözüm değil ama süper kolay ve birkaç bulmacayı çözmenize yardımcı olabilir. :)


5
Evet önceki () iyi çalışıyor. Ancak ilk giriş eforunuz başarısız olursa (yani 'giriş başarısız' sayfası önceki sayfanız olur) ve ikinci giriş eforu başarılı olursa tekrar giriş sayfasına yönlendirilirsiniz (bu da sizi ana sayfaya yönlendirebilir).
Shriganesh Shintre

11

LoginControllers yapıcısını şu şekilde değiştirin:

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

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

Giriş sayfasından ÖNCE sizi sayfaya yönlendirecektir (2 sayfa geri).


Benim için çalışan tek kişi. Bu, bir yerde başka bir yönlendirmenin olduğu, ancak kimin nerede olduğunu bilmesi gerektiği anlamına gelmelidir.
Arthur Tarasov

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

bu sizi projenizin varsayılan sayfasına, yani başlangıç ​​sayfasına yönlendirecektir.


6

Laravel 5. için * bunları deneyin.

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

veya

return Redirect::intended('/');

5

Laravel 3

(Vinícius Fragoso Pinheiro) kodunuzu hafifçe değiştirdim ve aşağıdaki işlemleri filters.php dosyasına yerleştirdim.

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

Ve sonra benim AuthController.php içinde:

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

Dikkat edin 'redirect'Kimlik doğrulama sorunu varsa oturum verilerinin geri döndürüldüğüne . Bu, herhangi bir oturum açma sırasında yönlendirmeyi bozulmadan tutar, ancak kullanıcı herhangi bir noktada tıklarsa, bir sonraki oturum açma işlemi oturum verileri tarafından kesintiye uğramaz.

Ayrıca, giriş formunu sizin adresinizde gösterme noktasında daralmanız gerekir AuthController, aksi takdirde zincir bozulur:

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


0

Larvel 5.3 Bu aslında LoginController.php dosyasını güncelleyerek benim için çalıştı

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

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


0

İçin laravel 5.5 ve muhtemelen 5.4

In App \ Http \ Ara Katman \ RedirectIfAuthenticated değişikliği redirect('/home')için redirect()->intended('/home')tanıtıcı işlevinde:

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

    return $next($request);
}

içinde App \ Http \ Controllers \ Auth \ LoginController oluşturmak showLoginForm()aşağıdaki gibi işlevini:

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

Bu şekilde başka bir sayfa için bir niyet varsa, oraya yönlendirir, aksi takdirde eve yönlendirir.


0

Laravel 5.7 için özel bir giriş denetleyicisi ve ara katman yazılımı ile aşağıdaki yaklaşımı kullanıyorum, ancak umarım laravel 5 sürümlerinin herhangi birinde çalışır

  • ara katman içi

    if (Auth::check()){
        return $next($request);
    }
    else{
      return redirect()->guest(route('login'));
    }
  • iç denetleyici giriş yöntemi

    if (Auth::attempt(['email' => $email, 'password' => $password])) {
    return redirect()->intended('/default');
    }
  • Hedeflenen URL'yi istemci tarafına geçirmeniz gerekiyorsa , aşağıdakileri deneyebilirsiniz

       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

İlk olarak, kullanıcıyı 'giriş' yoluna nasıl yönlendirdiğinizi bilmelisiniz:

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

Böyle değil:

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

0

Laravel artık bu özelliği kullanıma hazır olarak destekliyor! (5.5 veya daha eski bir süreden beri inanıyorum).

Aşağıda gösterildiği gibi bir __construct()yöntem ekleyin Controller:

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

Giriş yaptıktan sonra, kullanıcılarınız başlangıçta ziyaret etmeyi amaçladıkları sayfaya yönlendirilir.

Laravel'in e-posta doğrulama özelliğini uygulama mantığınızın gerektirdiği şekilde de ekleyebilirsiniz:

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

Belgeler çok kısa bir örnek içeriyor:

Ayrıca, ara yazılımın hangi denetleyici yöntemlerinin uygulanacağını except veya onlyseçeneklerini kullanarak seçmek de mümkündür .

İle örnek except:

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

İle örnek only:

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

exceptVe onlyara katman yazılımı seçenekleri hakkında daha fazla bilgi :


0

axios veya başka bir AJAX javascript kütüphanesi kullanıyorsanız URL'yi geri almak ve kullanıcı arabirimine geçmek isteyebilirsiniz

bunu aşağıdaki kodla yapabilirsiniz

   $default = '/';

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

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

Bu, json biçimli bir dize döndürür


0

Laravel 5.8

App \ Http \ Controllers \ Auth \ LoginController'da aşağıdaki yöntemi ekleyin

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

App \ Http \ Middleware \ RedirectIfAuthenticated, "return redirect ('/ home');" ifadesini aşağıdaki ile değiştir

 if (Auth::guard($guard)->check()) 
    {
        return redirect()->intended();
    }

-1

Bunu route.php dosyasında denediniz mi?

Route::group(['middleware' => ['web']], function () {
    //
    Route::get('/','HomeController@index');
});

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

2
Lütfen bir bağlam sağlamak için kodunuzla birlikte ilerlemek için bazı yorumlar sağlayın. Teşekkürler
Suever

-1

İşte benim 5.1 için çözümüm. Bir yayında "Beğen" düğmesini tıklamak, giriş yapmak için yönlendirilmek ve ardından orijinal sayfaya dönmek için birine ihtiyacım vardı. Önceden giriş yapmışlarsa href, "Beğen" düğmesinin JavaScript ile durdurulmuş ve AJAX isteğine dönüştürülmüştür.

Düğme gibi bir şey <a href="https://stackoverflow.com/like/931">Like This Post!</a>. ara katman yazılımı /like/931gerektiren bir LikeController tarafından işlenir auth.

Kimlik doğrulaması ara katman yazılımında ( handle()işlev), başlangıçta şöyle bir şey ekleyin:

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

/auth/loginURL'niz giriş yapmak için ne olursa olsun değiştirin . URL giriş URL'si değilse, bu kod orijinal sayfanın URL'sini oturumda kaydeder. Bu ara katman yazılımı iki kez çağrılmış gibi göründüğü için bu gereklidir . Neden ya da bunun doğru olup olmadığından emin değilim. Ancak bu koşulu kontrol etmezseniz, doğru orijinal sayfaya eşit olacak ve bir şekilde değiştirilecektir /auth/login. Muhtemelen bunu yapmanın daha zarif bir yolu var.

Ardından, LikeControllerorijinal sayfaya itilen düğmenin URL'sini işleyen veya hangi denetleyiciye sahip olursanız olun:

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

Bu yöntem süper basittir, mevcut işlevlerin geçersiz kılınmasını gerektirmez ve harika çalışır. Laravel'in bunu yapmasının daha kolay bir yolu var, ancak bunun ne olduğundan emin değilim. intended()Benim durumumda bu işlevi kullanmak işe yaramaz çünkü LikeController, önceki URL'nin ona geri yönlendirmek için ne olduğunu da bilmeliydi. Esasen iki seviye geri yönlendirme.


-1

Laravel 5.2 için (önceki sürümlerde kullanmadım)

Kodu app \ Http \ Controllers \ Auth \ AurhController.php dosyasına yapıştırın

   /**
 * 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*/
}

Ve ad alanını içe aktarın: use Session;

App \ Http \ Controllers \ Auth \ AurhController.php dosyasında herhangi bir değişiklik yapmadıysanız, GitHub'daki dosyayla değiştirebilirsiniz.


-1

Laravel 5.2

Yönetici ara katman yazılımı gibi başka bir Ara katman yazılımı kullanıyorsanız, aşağıdakileri kullanarak url.intended için bir oturum ayarlayabilirsiniz :

Temel olarak \Session::put('url.intended', \URL::full());yönlendirme için manuel olarak ayarlamamız gerekir .

Misal

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

Giriş denemesinde

Giriş yapma girişimi kullanımında emin olun return \Redirect::intended('default_path');


Bunun redirect()->guest('login')için.
Emile Bergeron

-1

Laravle 5.7 için, değişiklik yapmanız gerekir:

Ara Katman> RedirectIfAuthenticated.php

Bunu değiştir:

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

        return $next($request);
    }

Buna:

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

        return $next($request);
    }

dönüş yönlendirmesi ('/ yolunuz');


Nedir mypath? (kullanıcı buna geri döner)
Mostafa Norzade
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.