【问题标题】:Why do I get an error in Laravel when session has timed out and I try to log out beyond that time当会话超时并且我尝试在该时间之后注销时,为什么我会在 Laravel 中收到错误
【发布时间】:2020-04-14 10:44:07
【问题描述】:

我正在 Homestead 上运行 Laravel 6。我在这里看到了类似的错误,但没有针对我的情况。

  • 如果我登录,那很好。
  • 如果我直接退出,也可以。
  • 如果我让屏幕超时超过 .env 中设置的 session_lifetime,它不会在没有此错误的情况下注销。
Argument 1 passed to Illuminate\Session\Middleware\StartSession::addCookieToResponse() 
must be an instance of Symfony\Component\HttpFoundation\Response, string given, 
called in /home/vagrant/code/MySite/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php on line 60

我正在学习 Laravel 并来自 vanilla php,我不知道从哪里开始寻找。提前致谢。

我在 web.php 中使用 Auth:routes() 时无权访问登录路由。我想我可能已经通过覆盖 logout() 解决了这个问题。似乎有点简单。想知道这是否安全?

    public function logout(Request $request){
    Auth::logout();
    return  redirect()->route('home');
    }

编辑,抱歉,这并不能解决我的问题。它在活动会话时间内有效,但在此之外我有同样的问题

不幸的是,这对我不起作用。我看到了为什么它应该但同样的错误显示的逻辑。作为一个实验,我只是在注销方法中自己返回了“hello world”,果然它只是显示在注销页面上,没有错误。但是如果我这样做,我会得到与上面相同的错误(没有注销功能只是一个 rtn 视图)

    public function logout(Request $request){
      //if (Auth::check()) {
      //  Auth::logout();
      //}
      //return  redirect()->route('home');
      //$request->session()->flush();
      return view('front.pages.aboutus');
      //return  "hello world";
    }

如您所见,我也一直在尝试使用 flush(),但没有任何乐趣。

【问题讨论】:

    标签: php laravel session


    【解决方案1】:

    Laravel 使用会话 cookie。如果您赋予该 cookie 一个生命周期,浏览器将在生命周期到期后立即删除该 cookie。因此,在您的 Laravel 项目中,您不能再通过手动删除 cookie 来注销用户,因为 cookie 已经消失了。

    编辑以使我的答案与问题中更改的详细信息相对应:
    两种可能的解决方案:如果您可以更改路由,则使您的注销路由仅对登录用户可用。如果他们已经注销,只需重定向到主页。 (见Route middlewares in Laravel Authentication Docs

    如果您不能/不想操纵您的路线,作为一种更直接的方法,您可以在注销功能中执行Auth::check()。 如果Auth::check()返回true,则用户已登录,需要先注销:

        public function logout(Request $request){
          if (Auth::check()) {
            Auth::logout();
          }
          return  redirect()->route('home');
        }
    

    (请参阅 Laravel 文档以获取 Retrieving The Authenticated User

    【讨论】:

    • 谢谢 Mastacheata。我认为 Laravel 会涵盖这种情况。您认为我可以在代码中的哪个位置检查单击注销时是否存在 cookie 并重定向到登录页面
    • 介意显示您的代码错误在哪里吗?您只能检查会话中是否存在键/变量,但不能使用 Laravel 真正确定会话本身当前是否处于活动状态/是否存在。您可能会将您的注销路线标记为“仅经过身份验证”并重定向到首页或您的注销导致的任何其他地方。
    • 编辑了我的答案以与您的编辑相对应,并显示解决您当前问题的解决方案,并指出如何“以正确的方式”做到这一点 - 希望这会有所帮助
    【解决方案2】:

    好的,最终发现了问题。当我尝试调试 419 问题并忘记将其更改回来时,我在应用程序/异常处理程序方法中返回了一个字符串

        public function render($request, Exception $exception)
        {
          if ($exception instanceof \Illuminate\Session\TokenMismatchException) {
              return redirect()->route('login'); // <- the solution
              //return "hello world";// <- the problem
          }
            return parent::render($request, $exception);
        }
    
    

    我认为无论实际会话是否超时,让用户在单击注销后转到有用的地方都是一个很好的解决方案。 419?很没用。至少上述解决方案将它们发送到某个地方。我也想,这可能是与我这里不同的路线选择。感谢 Mastacheata 在此过程中提供的帮助。

    【讨论】:

      猜你喜欢
      • 2017-05-18
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      相关资源
      最近更新 更多