【问题标题】:Laravel 5 Auth Logout not destroying sessionLaravel 5 Auth Logout 不会破坏会话
【发布时间】:2015-06-19 17:53:49
【问题描述】:

我正在为我的新项目使用 Laravel5 身份验证系统,我可以毫无问题地使用注册和登录功能,但注销没有按预期工作,但是我被重定向到 $redirectAfterLogout 指定的 url 但它没有销毁会话,因此即使在点击注销按钮后我也可以看到仪表板。

请问laravel Auth系统有bug吗,请指教,谢谢

【问题讨论】:

  • 你怎么知道会话是否被破坏?您是否使用 auth 限制了路由?
  • @sgt 点击注销链接后,我无法访问/auth/login,它只是将我重定向到仪表板。
  • 我遇到了同样的问题,我的错误是把中间件“guest”放到了注销路径。 :/ 也许你也有同样的问题。

标签: php laravel


【解决方案1】:

您没有提供任何您使用过的代码。但是,以下代码有效:

public function getLogout(){
    Auth::logout();
    Session::flush();
    return Redirect::to('/');
}

Session::flush();清除所有现有会话。

【讨论】:

  • 我目前使用的是 Laravel 5 的内置认证机制
  • 所以我希望你现在能够销毁会话?
  • 我遇到了同样的问题,我的错误是把中间件“guest”放到了注销路径。 :/ 也许你也有同样的问题。
【解决方案2】:

使用 Laravel 5.2,我注册了一个监听器,处理了注销事件并按照上面的建议调用了 Session::flush。似乎工作得很好。希望这会有所帮助。

EventServiceProvider.php

protected $listen = [
    'App\Events\SomeEvent' => [
        'App\Listeners\EventListener',
    ],
    'Illuminate\Auth\Events\Logout' => [
        'App\Listeners\ClearSessionAfterUserLogout'
    ],
]; 

ClearSessionAfterUserLogout.php

public function handle(Logout $event)
{
    Session::flush();
}

【讨论】:

  • 我遇到了同样的问题,我的错误是把中间件“guest”放到了注销路径。 :/ 也许你也有同样的问题。
【解决方案3】:

我遇到了同样的问题,我尝试了所有方法,但最后我可以解决它。

我的问题是,当我点击注销按钮时,在此之前我有一些尚未响应的 http 请求,所以即使用户注销,后来随着挂起请求的响应它登录了再次。这是一个例子:

Another Request |   ***********************************
Logout Request  |          ********************
                |
Time            | --|------|-------------------|------|------>
                   t1      t2                  t3     t4

因此,删除那些未得到答复的请求对我有用。我希望这个答案有帮助:)

【讨论】:

  • 在哪里删除那些未答复的请求?
  • 就我而言,我在一些 JQuery ajax 调用中发现了这些请求,所以我只是删除了该代码,然后注销开始按预期工作。希望我能帮上忙:)
【解决方案4】:

通过在控制器操作中接受请求对象(记得在控制器命名空间声明之后添加:use Auth;):

 /**
 *
 * Render page
 *
 * @route POST /user/{user_id}/logout
 *
 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
 */
public function logout(Request $request) {
    Auth::logout();
    $request->session()->flush();
}

【讨论】:

    【解决方案5】:

    我切换到数据库会话驱动程序并在我的注销操作中使用了以下代码

    $request->session()->getHandler()->destroy($request->session()->getId());
    

    【讨论】:

      【解决方案6】:

      trait AuthenticatesUsers

      public function logout(Request $request)
      

      改一下

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

      到这里

      $request->session()->regenerate(true);
      

      【讨论】:

        【解决方案7】:

        好像在

        /vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php 
        

        永远不会到达function getLogout(),因此永远不会触发logout() 方法。

        就我而言,就我而言

        /app/Http/routes.php
        

        而不是这个:

        Route::get('auth/logout', 'Auth\AuthController@getLogout');  
        

        我改成:

        Route::get('auth/logout', 'Auth\AuthController@logout');
        

        【讨论】:

        • 顺便说一句,此解决方案适用于 Laravel 5.2.29。也许这些版本在幕后略有修改
        【解决方案8】:

        在您的情况下,您可能没有达到 logout() 方法。如果您使用的是 Laravel 5 构建的身份验证机制,那么您将运行 AuthenticatesAndRegistersUsers trait getLogout() 方法,该方法执行 $this->auth->logout();

        找到此代码编辑如下方法进行调试。如果您看到字符串“Logging out”,则您必须注销。否则,您的路由出现问题,并且永远不会执行注销。

        /**
         * Log the user out of the application.
         *
         * @return \Illuminate\Http\Response
         */
        public function getLogout()
        {
            dd("Logging out");
            $this->auth->logout();
        
            return redirect('/');
        }
        

        【讨论】:

        • 是的,我在点击注销链接后在屏幕上看到“注销”,这意味着注销链接正在点击此功能。
        • 其他选项可能是您记住了您的帐户。请在 logout() 调用前后检查用户登录状态。您可以使用 dd($this->auth->user());为了这。这将确定用户在注销后是否已登录
        • 刚试过这个测试,通话后变空,这意味着它正在破坏auth->user(),但是为什么即使在注销后登录页面也会重定向到仪表板。
        • 在未来的某个时候用户一定已经重新登录了。你需要检查你的控制器 getLogin() 方法并找出确切的位置
        【解决方案9】:

        我一直在努力解决这个问题,我已经找到了解决方案。

        简而言之:Laravel 会话使用中间件进行读写。它在请求开始时读取存储的会话,并在请求结束时写入任何更改。如果您进行重定向,则当前请求永远不会完成,并且不会发生中间件写入。

        那么,如何解决这个问题?根据您的实现...您应该 return 重定向命令而不是直接调用它。

        return redirect($redirectAfterLogout)
        

        【讨论】:

          【解决方案10】:

          我遇到了一个类似的问题,结果是使用“文件”驱动程序进行会话,不知何故服务器正在创建以后无法修改的文件,但没有文件权限警告。我切换到了一个 redis 实现,所以很遗憾我不能说如何解决文件创建问题,但我认为这可能会节省一些时间。

          【讨论】:

            【解决方案11】:

            您可以简单地覆盖 AuthController.php 中的注销方法

            这里是代码示例:

            public function logout(){
                    Session::flush();
                    Auth::guard($this->getGuard())->logout();
                    return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
                }
            

            【讨论】:

              【解决方案12】:
              Auth()->logout();
              

              对于最新版本。

              【讨论】:

              • 到目前为止仍然需要,我认为这是关于您是否允许注销请求在期望用户完全注销之前完全执行。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-07-02
              • 2013-11-10
              • 2012-07-19
              • 1970-01-01
              • 2014-07-02
              • 1970-01-01
              • 2015-12-09
              相关资源
              最近更新 更多