Laravel 5 Auth Logout不会破坏会话

时间:2015-04-14 07:55:45

标签: php laravel

我正在为我的新项目使用Laravel5 Auth系统,我可以使用注册和登录功能而不会出现任何问题,但注销无法正常工作,但是我被重定向到$redirectAfterLogout指定的网址但是它不破坏会话所以即使在点击退出按钮后我也能看到仪表板。

laravel在Auth系统中有一些错误,请建议,谢谢

12 个答案:

答案 0 :(得分:17)

您尚未提供任何已使用的代码。但是,以下代码有效:

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

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

答案 1 :(得分:6)

使用Laravel 5.2,我注册了一个监听器,处理了logout事件,并按照上面的建议调用了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();
}

答案 2 :(得分:1)

似乎在

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

答案 3 :(得分:1)

我有同样的问题,我尝试了一切,但最终我可以解决它。

我的问题是,当我点击退出按钮时,在此之前我有一些尚未回答的http请求,所以即使用户注销,稍后还会挂起待处理请求的响应再次。这是一个例子:

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

因此删除那些未经回答的请求对我有用。我希望这个答案有助于:)

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

您可以简单地覆盖AuthController.php

中的注销方法

以下是代码示例:

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

答案 6 :(得分:1)

trait AuthenticatesUsers

public function logout(Request $request)

更改此

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

到这个

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

答案 7 :(得分:0)

在您的情况下,您可能无法访问logout()方法。如果您正在使用Laravel 5构建auth机制,那么您将运行AuthenticatesAndRegistersUsers trait getLogout()方法$this->auth->logout();

找到此代码编辑如下方法进行调试。如果你看到字符串"退出"然后你必须退出。哦,你的路由有问题,注销永远不会被执行。

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

    return redirect('/');
}

答案 8 :(得分:0)

我一直在与此作斗争,我已经找到了解决方案。

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

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

return redirect($redirectAfterLogout)

答案 9 :(得分:0)

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

答案 10 :(得分:0)

通过接受控制器动作中的请求对象(记住在控制器命名空间声明后添加它:使用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();
}

答案 11 :(得分:0)

Auth()->logout();

最新版本。