登录后,Laravel重定向回原始目的地

JOV*_*JOV 175 laravel laravel-4

这似乎是一个非常基本的流程,并且Laravel有很多很好的基本解决方案,我觉得我错过了一些东西.

用户单击需要身份验证的链接.Laravel的auth过滤器启动并将它们路由到登录页面.用户登录,然后转到他们试图在'auth'过滤器启动之前到达的原始页面.

有没有一种好方法可以知道他们最初尝试访问的页面?由于Laravel是拦截请求的人,因此我不知道在用户登录后是否跟踪某处以便轻松路由.

如果没有,我很想知道你们中的一些人是如何手动实现的.

vFr*_*sop 225

对于Laravel 5.3及以上版本

检查斯科特的答案如下.

对于Laravel 5高达5.2

简单的说,

在auth中间件上:

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

登录操作:

// 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');
}
Run Code Online (Sandbox Code Playgroud)

对于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');
    }
});
Run Code Online (Sandbox Code Playgroud)

登录操作:

// 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');
}
Run Code Online (Sandbox Code Playgroud)

对于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);
    }
});
Run Code Online (Sandbox Code Playgroud)
// 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();
}
Run Code Online (Sandbox Code Playgroud)

即使用户错过了键入的凭据,或者他没有帐户并且必须注册,在Session上存储重定向也有好处.

除了Auth之外,这还允许在会话上设置重定向,并且它会神奇地工作.

  • 我编辑了答案来解释为什么这比闪存更好. (2认同)

Sco*_*ers 63

Laravel> = 5.3

由于Auth Middleware已移至服务容器,因此5.3中的Auth更改使得实现更容易,并且略微不同于5.2.

修改新的中间件身份验证重定向器

/app/Http/Middleware/RedirectIfAuthenticated.php
Run Code Online (Sandbox Code Playgroud)

稍微更改手柄功能,所以它看起来像:

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

    return $next($request);
}
Run Code Online (Sandbox Code Playgroud)

TL; DR说明

唯一的区别在于第4行; 默认情况下它看起来像这样:

return redirect("/home");
Run Code Online (Sandbox Code Playgroud)

由于Laravel> = 5.3在检查Auth Guard时自动保存最后的"预期"路由,因此它将更改为:

return redirect()->intended('/home');
Run Code Online (Sandbox Code Playgroud)

这告诉Laravel在登录前重定向到最后一个目标页面,否则转到"/ home"或默认发送它们的任何地方.

希望这有助于其他人 - 5.2和5.3之间的区别并不多,特别是在这方面有很多.

  • 对于 Laravel 6.4,这不再起作用......有什么想法吗? (4认同)
  • 我会使用“返回重定向()->预期(RouteServiceProvider :: HOME);”将您的主路径保留在一处。 (4认同)

gia*_*kis 26

我发现这两个很棒的方法对你很有帮助.

Redirect::guest();
Redirect::intended();
Run Code Online (Sandbox Code Playgroud)

您可以将此筛选器应用于需要身份验证的路由.

Route::filter('auth', function()
{
    if (Auth::guest()) {
           return Redirect::guest('login');
    }
});
Run Code Online (Sandbox Code Playgroud)

这种方法基本上是存储您尝试访问的页面,它会将您重定向到登录页面.

用户通过身份验证后即可致电

return Redirect::intended();
Run Code Online (Sandbox Code Playgroud)

并且它会将您重定向到您最初尝试访问的页面.

这是一个很好的方法,虽然我通常使用下面的方法.

Redirect::back()
Run Code Online (Sandbox Code Playgroud)

你可以查看这个很棒的博客.


dab*_*uno 20

您可以使用Redirect :: intent函数.它会将用户重定向到他们在被authenticaton过滤器捕获之前尝试访问的URL.如果预期的目标不可用,则可以为该方法提供回退URI.

在登录/注册后:

return Redirect::intended('defaultpageafterlogin');
Run Code Online (Sandbox Code Playgroud)


Fed*_*ngo 11

我在语言选择器代码上使用了一段时间.只要您只需要返回1页就可以了,它可以正常工作:

return Redirect::to(URL::previous());
Run Code Online (Sandbox Code Playgroud)

它不是最强大的解决方案,但它非常简单,可以帮助解决一些难题.:)

  • 是的前一个()工作正常.但是,如果您的首次登录失败(因此"登录失败"页面成为您的上一页)并且第二次登录工作成功,那么您将再次重定向到登录页面(这可能会将您重定向到主页). (5认同)

Mev*_*mir 11

将LoginControllers构造函数更改为:

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

        $this->middleware('guest')->except('logout');
    }
Run Code Online (Sandbox Code Playgroud)

它将在登录页面之前将您重定向回页面(2页返回).

  • 在上述所有解决方案中,它对我的​​ Laravel 7 有用。太棒了,伙计! (2认同)

小智 10

对于 Laravel 8

以下方法适用于 Laravel 8。

基于控制器的方法

/app/Http/Controllers/Auth/AuthenticatedSessionController.php
Run Code Online (Sandbox Code Playgroud)

预登录

预期的 url 将存储在创建时的会话中:

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

登录后

成功登录后,如果会话中存在预期的 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);
}
Run Code Online (Sandbox Code Playgroud)


Par*_*gre 8

return Redirect::intended('/');
Run Code Online (Sandbox Code Playgroud)

这会将您重定向到项目的默认页面,即开始页面.


小智 6

对于laravel 5.*尝试这些.

return redirect()->intended('/');
Run Code Online (Sandbox Code Playgroud)

要么

return Redirect::intended('/');
Run Code Online (Sandbox Code Playgroud)


小智 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');
    }
});
Run Code Online (Sandbox Code Playgroud)

然后在我的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'));
}
Run Code Online (Sandbox Code Playgroud)

请注意,'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');
}
Run Code Online (Sandbox Code Playgroud)