Laravel은 로그인 후 원래 목적지로 다시 리디렉션


189

이것은 꽤 기본적인 흐름처럼 보이며 Laravel기본적인 것들에 대한 많은 훌륭한 솔루션을 가지고 있습니다.

사용자는 인증이 필요한 링크를 클릭합니다. Laravel의 인증 필터가 시작되어 로그인 페이지로 라우팅됩니다. 사용자가 로그인 한 다음 '인증'필터가 시작되기 전에 접속하려는 원래 페이지로 이동합니다.

원래 어떤 페이지로 이동하려고했는지 알 수있는 좋은 방법이 있습니까? 라 라벨은 요청을 가로채는 것이기 때문에 사용자가 로그인 한 후 쉽게 라우팅하기 위해 어딘가를 추적하는지 알지 못했습니다.

그렇지 않다면, 여러분 중 일부가 이것을 수동으로 구현 한 방법에 대해 궁금합니다.

답변:


234

라 라벨 5.3 이상

아래에서 Scott의 답변을 확인하십시오 .

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

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

라 라벨 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 외에 세션에서 리다이렉션을 설정할 수있게하며 마술처럼 작동합니다.


두고 잊는 것보다 세션에 플래시하는 것이 더 합리적이지 않습니까? 로그인 작업은 세션의 값으로 리디렉션을 반환하고 그렇지 않으면 기본 페이지를 반환합니다.
bilalq

2
왜 이것이 플래시보다 나은지 설명하기 위해 답변을 편집했습니다.
vFragosop

말이 되네요 매번 다시 플래시하는 것보다 낫습니다.
bilalq

1
Auth :: attempt ()가 전달되면 사용자를 기본 페이지 (일반적으로 자신의 홈)로 리디렉션 할 수 있습니다. 이 리디렉션은 해당 필터를 다시 통과하고 요청 된 URL이 있으면 원래 URL로 리디렉션합니다. 그렇지 않으면 단순히 그의 집을 계속 렌더링 할 것입니다. 로그인 동작의 예를 들어 보겠습니다.
vFragosop

1
5.1에서는 미들웨어 RedirectIfAuthenticated.php에 있습니다. if ($ this-> auth-> check ()) {return redirect ( '/ privatepage'); }
Dave Driesmans 2016 년

73

라 라벨> = 5.3

5.3의 Auth 변경은 Auth Middleware가 서비스 컨테이너로 이동되었으므로이 구현을 조금 더 쉽고 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 설명

유일한 차이점은 네 번째 줄입니다. 기본적으로 다음과 같습니다.

return redirect("/home");

Laravel> = 5.3은 Auth Guard를 확인할 때 마지막 "의도 된"경로를 자동으로 저장하므로 다음과 같이 변경됩니다.

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

그러면 Laravel은 로그인하기 전에 마지막으로 의도 한 페이지로 리디렉션하도록 지시합니다.

이것이 다른 사람에게 도움이되기를 바랍니다 .5.2와 5.3의 차이점에는 그다지 많지 않으며이 분야에는 특히 몇 가지가 있습니다.


2
Laravel 6.4의 경우 더 이상 작동하지 않습니다 ... 어떤 아이디어 pls?
alex toader 10

return redirect()->intended(RouteServiceProvider::HOME);한 곳에서 집 경로를 유지 하는 데 사용 합니다.
Mateusz

26

나는 당신에게 매우 도움이 될 두 가지 위대한 방법을 발견했습니다.

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

인증이 필요한 경로에이 필터를 적용 할 수 있습니다.

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

이 방법은 기본적으로 방문하려는 페이지를 저장하는 것이며 로그인 페이지로 리디렉션됩니다 .

사용자가 인증되면 전화를 걸 수 있습니다

return Redirect::intended();

처음에 도달하려는 페이지로 리디렉션됩니다.

나는 보통 아래 방법을 사용하지만 그것을하는 좋은 방법입니다.

Redirect::back()

멋진 블로그를 확인할 수 있습니다 .


이것은 위의 솔루션보다 훨씬 낫습니다. 위의 솔루션은 4.1에서 할 수 없었던 로그인 기능에 클로저를 전달할 수 있어야합니다. 그러나 이것은 훨씬 간단하고 그대로 작동했습니다.
user2662680

20

Redirect :: intended 기능을 사용할 수 있습니다 . authenticaton 필터에 걸리기 전에 사용자가 액세스하려는 URL로 사용자를 리디렉션합니다. 예정된 대상을 사용할 수없는 경우이 방법에 대체 URI가 제공 될 수 있습니다.

로그인 / 등록 후 :

return Redirect::intended('defaultpageafterlogin');

11

언어 선택기 코드에서 잠시 동안 이것을 사용했습니다. 한 페이지 만 돌아 가면 괜찮습니다.

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

그것은 가장 강력한 솔루션은 아니지만 매우 쉬우 며 몇 가지 퍼즐을 해결하는 데 도움이 될 수 있습니다. :)


5
예 previous () 잘 작동합니다. 그러나 첫 번째 로그인 시도가 실패하고 ( '로그인 실패'페이지가 이전 페이지가 됨) 두 번째 로그인 시도가 성공하면 다시 로그인 페이지로 리디렉션됩니다 (홈 페이지로 리디렉션 될 수 있음).
Shriganesh Shintre

11

LoginControllers 생성자를 다음과 같이 변경하십시오.

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

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

로그인 페이지 (2 페이지) 전에 페이지로 다시 리디렉션됩니다.


나를 위해 일하는 유일한 사람. 어딘가에서 다른 리디렉션이 발생하지만 누가 어디 있는지 알고 있어야합니다.
Arthur Tarasov

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

그러면 프로젝트의 기본 페이지 즉 시작 페이지로 리디렉션됩니다.


6

laravel 5. *의 경우 다음을 시도하십시오.

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

또는

return Redirect::intended('/');

5

라 라벨 3

귀하의 (Vinícius Fragoso 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');
}

3

사용하다 Redirect;

그런 다음 이것을 사용하십시오 :

return Redirect::back();

0

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


0

대한 Laravel 5.5 아마도 5.4

에서 앱 \ HTTP를 \ 미들웨어 \ 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);
}

에서 앱 \ HTTP를 \ 컨트롤러 \ 인증 \ 인 LoginController가 작성 showLoginForm()다음과 같은 기능을 :

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

이렇게하면 다른 페이지에 대한 의도가 있으면 리디렉션되고 그렇지 않으면 홈으로 리디렉션됩니다.


0

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

먼저 사용자를 '로그인'경로로 리디렉션하는 방법을 알아야합니다.

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

이건 아니야:

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

0

라 라벨은 이제이 기능을 즉시 지원합니다! (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']]);
}

에 대한 자세한 정보 exceptonly미들웨어 옵션 :


0

Axios 또는 다른 AJAX 자바 스크립트 라이브러리를 사용하는 경우 URL을 검색하여 프런트 엔드로 전달할 수 있습니다.

아래 코드로 그렇게 할 수 있습니다

   $default = '/';

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

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

이것은 JSON 형식의 문자열을 반환합니다


0

라 라벨에서 5.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에서 "return redirect ( '/ home');"을 다음과 같이 바꿉니다.

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

-1

routes.php에서 이것을 시도 했습니까?

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
상황에 맞는 코드와 함께 설명을 제공하십시오. 감사합니다
Suever

-1

다음은 5.1에 대한 해결책입니다. 게시물에서 '좋아요'버튼을 클릭하고 로그인으로 리디렉션 된 다음 원래 페이지로 돌아가는 사람이 필요했습니다. 이미 로그인 한 href경우 "좋아요"버튼 중 하나가 JavaScript로 인터셉트되어 AJAX 요청으로 전환되었습니다.

버튼은와 같습니다 <a href="https://stackoverflow.com/like/931">Like This Post!</a>. 미들웨어 /like/931가 필요한 LikeController에 의해 처리됩니다 auth.

미들웨어 인증 ( handle()함수)에서 시작할 때 다음과 같이 추가하십시오.

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

/auth/login로그인 할 URL로 변경하십시오 .이 코드는 URL이 로그인 URL이 아닌 경우 세션에 원래 페이지의 URL을 저장합니다. 이 때문에이 필요합니다 나타납니다 이 미들웨어가 두 번 호출되는 것처럼. 왜 그런지 확실하지 않습니다. 그러나 해당 조건을 확인하지 않으면 올바른 원본 페이지와 같으며 어떻게 든 기회를 얻습니다 /auth/login. 더 우아한 방법이있을 것입니다.

그런 다음 LikeController원래 컨트롤러에서 누른 버튼의 URL을 처리하는 컨트롤러가 무엇이든간에 :

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

이 방법은 매우 간단하고 기존 기능을 재정의 할 필요가 없으며 훌륭하게 작동합니다. 라 라벨이 이것을하기 쉬운 방법이있을 수 있지만, 그것이 무엇인지 잘 모르겠습니다. intended()LikeController는 이전 URL이 다시 리디렉션되어야하는 것이 무엇인지 알고 있어야했기 때문에 함수 사용이 작동하지 않습니다. 기본적으로 두 가지 수준의 리디렉션입니다.


-1

라 라벨 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 의 파일로 바꾸면됩니다.


-1

라 라벨 5.2

Admin 미들웨어 와 같은 다른 미들웨어를 사용하는 경우 다음을 사용하여 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');


그게 다야 redirect()->guest('login').
Emile Bergeron

-1

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


무엇입니까 mypath? (User pass this back)
Mostafa Norzade
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.