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() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章