Laravel 5.2:Auth::logout() 不起作用

Posted

技术标签:

【中文标题】Laravel 5.2:Auth::logout() 不起作用【英文标题】:Laravel 5.2: Auth::logout() is not working 【发布时间】:2016-04-01 12:06:17 【问题描述】:

我正在 Laravel 5.2 中构建一个非常简单的应用程序,但是当使用 AuthController 的操作注销时,它根本不起作用。我有一个导航栏,用于检查Auth::check(),并且在调用注销操作后它不会改变。

我在 routes.php 文件中有这条路线:

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

它在外面

Route::group(['middleware' => ['web']], function () 声明。

我也尝试在 AuthController.php 文件的末尾添加以下操作。

public function getLogout() 

    $this->auth->logout();
    Session::flush();
    return redirect('/');

你有什么想法吗?

编辑 1

如果我清除 Google 的 Chrome 缓存,它就可以工作。

【问题讨论】:

“不起作用”是什么意思?您能否详细解释一下您执行了哪些操作以及哪些操作不起作用? 你好@MarcinNabiałek。我编辑了这个问题。我希望它得到更好的解释。 您的注销路径不应在web 中间件组之外。它应该在里面。 @ThomasKim 仍然不起作用 Auth::logout() 是做什么的?它会带来相同的结果吗?尽管它应该带来相同的结果。无论如何,你能发布整个AuthController 代码吗? 【参考方案1】:

使用下面的代码

Auth::logout();

auth()->logout();

【讨论】:

【参考方案2】:

我在 Laravel 5.2 中也遇到了类似的问题。您应该将路线更改为

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

或在 AuthController 构造函数中添加

public function __construct()

    $this->middleware('guest', ['except' => ['logout', 'getLogout']]);

这对我有用。

【讨论】:

谢谢。我稍后会检查这个,如果它有效,我会接受它作为答案。 @Aztecnologic 此修复了 my 问题。不知道为什么我们必须在 Laravel 5.2 中编写自定义注销方法——我在 5.1 中不需要。哦,好吧。 谢谢。也解决了我的问题。任何解释为什么?似乎与使用旧的 laravel/laravel 样板存储库时从 5.1 更新到 5.2 相关联。 除上述答案外,您还可以通过在 AuthController protected $redirectAfterLogout = 'auth/login'; 中添加以下代码来自定义注销后的重定向; getLogout 添加到except 数组对我有用。【参考方案3】:

这应该是 AuthController 中构造函数的内容

$this->middleware('web');
$this->middleware('guest', ['except' => 'logout']);

【讨论】:

【参考方案4】:

Http->Middleware->Authenticate.php 中将 else 语句中的 login 更改为 /

return redirect()->guest('/');

并在 routes.php 中定义以下路由

Route::get('/', function () 
    return view('login');
);

用于注销调用以下函数:

public function getlogout()
    \Auth::logout();
    return redirect('/home');

重要提示:重定向到/home,而不是首先调用$this->middleware('auth');然后在中间件中重定向到//

【讨论】:

【参考方案5】:

问题出在 AuthController 构造函数中的“guest”中间件。应该从$this->middleware('guest', ['except' => 'logout']);改成$this->middleware('guest', ['except' => 'getLogout']);

如果你检查内核文件,你可以看到你的客户中间件指向\App\Http\Middleware\RedirectIfAuthenticated::class

此中间件检查用户是否通过身份验证,如果通过身份验证,则将用户重定向到根页面,但如果未通过身份验证,则让用户执行操作。通过使用$this->middleware('guest', ['except' => 'getLogout']);,调用getLogout函数时中间件将不会被应用,从而使经过身份验证的用户可以使用它。

N/B:与原始答案一样,您可以将 getLogout 更改为 logout,因为 getLogout 方法只是返回 laravel 实现中的 logout 方法。

【讨论】:

【参考方案6】:

将此行添加到routes.php 文件Route::get('auth/logout', 'Auth\AuthController@getLogout'); 并将其添加到您的视图中 <a href=" url('/auth/logout') " > Logout </a> 对我来说很好用

【讨论】:

【参考方案7】:

只需在下面添加路由,不要在任何路由组(中间件)中添加它:

Route::get('your-route', 'Auth\AuthController@logout');

现在注销应该可以在 L 5.2 中正常工作,而无需修改 AuthController 中的任何内容。

【讨论】:

【参考方案8】:
/**
 * 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()->flush();

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

    return redirect('/');


/**
 * Get the guard to be used during authentication.
 *
 * @return \Illuminate\Contracts\Auth\StatefulGuard
 */
protected function guard()

    return Auth::guard();

【讨论】:

以上是关于Laravel 5.2:Auth::logout() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

用户从Laravel 5.2中的帐户删除后没有注销的原因

Laravel Auth::logout() 失败

laravel5.2之logout注销账号无效

Laravel 5 - 在视图中使用 Auth::check()

GET Route Laravel 中的 URL 参数

为啥我登录后刷新页面时 Laravel 会注销?