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

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

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

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

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



답변

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


답변

라 라벨> = 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의 차이점에는 그다지 많지 않으며이 분야에는 특히 몇 가지가 있습니다.


답변

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

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

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

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

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

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

return Redirect::intended();

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

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

Redirect::back()

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


답변

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

로그인 / 등록 후 :

return Redirect::intended('defaultpageafterlogin');


답변

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

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

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


답변

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

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

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

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


답변

return Redirect::intended('/');

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