【问题标题】:Laravel clears whole session on logoutLaravel 在注销时清除整个会话
【发布时间】:2018-09-24 16:14:25
【问题描述】:

我在会话中保留了不同的东西,我在用户登录和注销时都使用它们。问题是当用户注销时,laravel 会清除我在会话中存储的所有内容:

这是因为 laravel 核心类 AuthenticatesUsers 看起来像这样:

/**
 * Log the user out of the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function logout(Request $request)
{
    $this->guard()->logout();

    $request->session()->invalidate();

    return redirect('/');
}

因为我不想更改核心类,如何避免在用户注销时丢失会话数据?

【问题讨论】:

  • 你不能。这是会话的基本原则。
  • 会话是一种存储信息(以变量形式)以在多个页面中使用的方式。用户是否登录只是可能存储在会话中的一条信息。仅仅因为用户退出就刷新整个会话没有任何意义。
  • @user1985273 实际上,注销后清除会话是有意义的。因为该数据与登录状态相关联(相关),一旦您注销,您通常需要一个“干净的状态”。例如,如果我登录到网上商店并在购物车中添加了一些东西,我希望当我注销时我的购物车会被清除,因为如果其他人在同一台机器上使用另一个帐户登录,他们应该在我退出之前无法看到我的购物车内容。如果您想为已登录的用户保留数据,您应该使用另一个持久层。
  • @Bogdan 这只是将登录用户数据保留在会话中的一个示例。但正如我所说,会话是一种跨多个请求存储信息的方法。该数据可能与登录的用户相关,也可能不相关。例如,如果我有一个多语言网站,我可能希望保留用户在会话中选择的语言,因此如果用户注销,网站仍将保留用户的语言之前选择的。所以在注销时清除所有会话数据对我来说仍然没有任何意义。
  • @Bogdan 为了获得一个“干净的状态”,我宁愿将所有登录的用户数据保存在我想在注销时清理的某个会话变量中。例如 $_SESSION['user']['cart']、$_SESSION['user']['whatever'] 并在注销时清除 $_SESSION['user']。这样你就可以得到“白板”并保留像 $_SESSION['selected_language'] 这样的数据

标签: php laravel laravel-5.4


【解决方案1】:

您不想更改代码以使您的会话不会失效。它的发生是有原因的。安全性。

相反,创建一个唯一代码并存储链接到该代码的购物车信息。然后将该代码存储在客户端的 cookie 中。然后每次看到 cookie 时,都会从数据库中加载购物车。

只是不要存储任何机密信息。一个人想买的东西如果别人看到(不是真的)就没有风险,所以不用担心将它存储为 cookie。只是不要存储链接到此 cookie 的私人信息。

【讨论】:

    【解决方案2】:

    默认 LoginController.php 使用特征 AuthenticatesUsers.php 。 所以将此代码复制到 LoginController.php 以覆盖它。

    public function logout(Request $request)
    {
        $data =  session()->get('cart');
        $this->guard()->logout();
    
        $request->session()->invalidate();
        $request->session()->regenerate();
        session()->put('cart', $data);
        return $this->loggedOut($request) ?: redirect('/');
    }
    

    【讨论】:

      【解决方案3】:

      我猜在登录控制器中覆盖注销方法可以解决问题。在你的控制器中编写这个函数(它是用 AuthenticatesUser trait 编写的):

      /**
      * Log the user out of the application.
      *
      * @param  \Illuminate\Http\Request  $request
      * @return \Illuminate\Http\Response
      */
      public function logout(Request $request)
      {
         $this->guard()->logout();
      // session logic here, just pull out things that need to and left other things as it is.
      
         // $request->session()->invalidate();
      
         return redirect('/');
      }
      

      我从来没有这样做过,但我认为它可能会奏效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-04
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        • 2015-03-03
        • 2013-03-28
        • 1970-01-01
        • 2017-03-04
        相关资源
        最近更新 更多