当前位置: 首页 > 知识库问答 >
问题:

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

祁景山
2023-03-14

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

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

有没有一个好方法可以知道他们最初想要到达的页面?由于Laravel是拦截请求的人,我不知道它是否会在用户登录后跟踪某个地方以方便路由。

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

共有3个答案

东方国安
2023-03-14

我发现这两种方法可能对你非常有帮助。

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

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

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

这个方法的基本功能是存储您试图访问的页面,并将您重定向到登录页面。

当用户通过身份验证后,您可以调用

return Redirect::intended();

它会把你重定向到你一开始试图到达的页面。

这是一个很好的方法,尽管我通常使用下面的方法。

Redirect::back()

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

狄望
2023-03-14

5.3中的Auth更改使实现这一点稍微容易一些,并且与5.2略有不同,因为Auth中间件已移动到服务容器中。

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

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

return redirect("/home");

自从Laravel

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

这告诉Laravel在登录前重定向到最后一个预定页面,否则转到“/home”或默认情况下您想发送它们的任何地方。

希望这对其他人有所帮助-5.2和5.3之间的差异不多,特别是在这方面,有相当多的差异。

杨曜瑞
2023-03-14

检查下面斯科特的答案。

简言之,

在身份验证中间件上:

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

在作出这一答复时,框架本身没有提供任何官方支持。现在你可以使用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');
}

你可以这样实现它:

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之外的任何东西在会话上设置重定向,它将神奇地工作。

 类似资料:
  • 在我的Laravel应用程序中,我有一个只能由Auth用户访问的私人页面。我也使用社交登录,所以当用户未登录就进入私人页面时,Laravel会将用户发送到登录页面,成功登录后,用户会被发送回原始目的地(私人页面)。只有当用户通过Laravel内置认证系统登录时,但当用户通过社交登录方法登录时,用户将被引导到主页。 这是我登录后的社交登录处理程序: 如果用户在会话中出现,我如何将其发送到原始目的地,

  • 我正在开发一个应用程序,它允许用户浏览网站并从任何页面登录(登录链接位于公共标题中)。成功登录后,用户当前将从登录页面重定向到根url。 redirect_to原始页面会更友好。我试图将原始页面的命名路由存储到会话中,但这些似乎是对象,因此无法通过。此外,并非所有路由都带有指定的助手。另一方面,当我将文字路径作为字符串传递给redirect_to时,例如“订单/索引”,Rails将 /action

  • 我在使用React路由器进行登录后重定向时遇到问题。 假设用户试图导航到但被重定向到因为他们的会话已过期。endpoint存在于PrivateRoute中。 登录后,我希望用户被引导到,但相反,他们目前只重定向到。 成功登录后,如何利用原始目的地进行重定向? 谢谢你的时间!

  • 我有一个页面,上面有一些内容和评论部分。评论只能由已登录的用户留下,因此我在页面中添加了一个登录表单供用户登录(仅当用户尚未登录时显示)。 我的问题是,当用户登录时,他们会被重定向回主页,而不是他们以前所在的页面。 我没有更改开箱即用设置的登录方法。 任何人都可以建议一个简单的方法来设置重定向url。我的想法是,能够将其设置为表单会很好。

  • 每个人登录后,我一直无法使用Laravel重定向。连接工作,在我登录后,它重定向到一个空白页面,但如果我更改url路径,我可以访问不同的网页。我们将不胜感激!我正在使用LDAP进行连接,它正在工作。 请让我知道,如果有任何其他代码,我应该提供。 非常感谢。 (重定向IfAuthenticated.php) 命名空间应用程序\ Http\中间件; 使用闭包;使用Illumb\Support\Faca

  • 我在Laravel5.2中使用了php artisan函数。 我想重定向的客人登录页面,若客人点击链接,只有用户并没有客人。 我想在登录后将用户重定向到后面的页面。 我怎么能这么做?请详细展示一些文件名示例。 ///////编辑 路线 控制器 Kernel.php