如何注销和重定向到登录页面使用 Laravel5.4?

我正在使用 Laravel 5.4并尝试实现身份验证系统。我使用 php artian 命令 make: auth 来设置它。我根据我的布局编辑了视图。现在,当我试图注销它时,会出现这个错误

RouteCollection.php 中的 NotFoundHttpException 第161行:

有人能教我怎么注销吗?

231009 次浏览

在你的 web.php(路线) :

补充:

Route::get('logout', '\App\Http\Controllers\Auth\LoginController@logout');

在你的 LoginController.php

补充:

public function logout(Request $request) {
Auth::logout();
return redirect('/login');
}

同样,在 LoginController.php的顶部,在 namespace之后

补充:

use Auth;

现在,您可以使用 yourdomain.com/logout URL 注销,或者如果已经创建了 logout button,则将 href 添加到 /logout

即使@Tauras 的建议有效,我也不认为这是正确的处理方法。

你说你已经运行 php artisan make:auth,也应该插入 Auth::routes();在您的 routes/web.php路由文件。它带有已经定义的默认 logout路由,名为 logout

您可以使用 在 GitHub 上可以看到,但为了简单起见,我还将在这里报告代码:

    /**
* Register the typical authentication routes for an application.
*
* @return void
*/
public function auth()
{
// Authentication Routes...
$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
$this->post('login', 'Auth\LoginController@login');
$this->post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
$this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
$this->post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');
}

然后再次请注意,logout 需要 POST作为 HTTP 请求方法。这背后有许多合理的原因,但只是提到一个非常重要的是,这样你可以防止 跨站请求伪造

因此,根据我刚才指出的正确方法,实现这一点可以是这样的:

<a href="\{\{ route('logout') }}" onclick="event.preventDefault(); document.getElementById('frm-logout').submit();">
Logout
</a>
<form id="frm-logout" action="\{\{ route('logout') }}" method="POST" style="display: none;">
\{\{ csrf_field() }}
</form>

最后注意,我已经插入了幼虫出箱的准备功能 \{\{ csrf_field() }}

您可以在控制器中使用以下内容:

return redirect('login')->with(Auth::logout());

5.5秒

增加

Route::get('logout', 'Auth\LoginController@logout');

我的路线文件工作正常。

如果您使用5.5中的 auth 脚手架,只需将 href指向:

\{\{ route('logout') }}

不需要更改任何路由或控制器。

这里还有另一种方法,即在路由中调用 Auth: : logout ()

Route::get('/logout', function(){
Auth::logout();
return Redirect::to('login');
});

我建议您继续使用 web.php: Auth::routes()中的 Laravel auth 路由

它将创建以下路线:

POST | logout | App\Http\Controllers\Auth\LoginController@logout

您需要使用 POST 表单注销。这样,您还需要建议使用的 CSRF 令牌。

<form method="POST" action="\{\{ route('logout') }}">
@csrf
<button type="submit">Logout</button>
</form>

对 Laravel 5.8来说最好的方法

百分百成功

将此函数添加到 Auth LoginController.php

use Illuminate\Http\Request;

再加上这个

public function logout(Request $request)
{
$this->guard()->logout();


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


return $this->loggedOut($request) ?: redirect('/login');
}

在 Laravel 6.2

将以下路由添加到: Web.php

Route::post('logout', 'Auth\LoginController@logout')->name('logout');

使用带注销的 Achor 标记使用 POST 表单。

 <a class="log-out-btn" href="#" onclick="event.preventDefault();document.getElementById('logout-form').submit();"> Logout </a>


<form id="logout-form" action="\{\{ route('logout') }}" method="POST" style="display: none;">
\{\{ csrf_field() }}
</form>

将下面的代码添加到 LoginController.php 中更好、更安全,这些代码只在标准注销之后运行:

use AuthenticatesUsers;


protected function loggedOut(Request $request)
{
return redirect('/new/redirect/you/want');
}

如果你想通过代码在特定条件下做到这一点,这里的解决方案为我工作。我在中间件中使用过阻止某些用户: 下面的代码是注销的实际代码:

$auth = new LoginController();
$auth->logout($request);

完整档案:

namespace App\Http\Middleware;
use Closure;
use Auth;
use App\Http\Controllers\Auth\LoginController;
class ExcludeCustomers{
public function handle($request, Closure $next){
$user = Auth::guard()->user();
if( $user->role == 3 ) {
$auth = new LoginController();
$auth->logout($request);
header("Location: https://google.com");
die();
}
return $next($request);
}
}

我知道这个问题是问旧版本的幼虫。我想分享我的解决方案的 Laravel 8.65版本。 在 AuthenticatedSessionController中更新破坏函数如下。

public function destroy(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/admin');
}

更新从 return redirect('/')return redirect('/admin');的最后一行

在 Laravel 9

进入路由目录打开 web.php 并写出注销路由:

use App\Http\Controllers\Auth\LoginController;
Route::get('logout', [LoginController::class,'logout']);

从刀片添加注销 URL

<a class="dropdown-item" href=\{\{route('logout')}}>Logout</a>

通知

注销功能将重定向到主页 /

如果要重定向到登录页面,应该覆盖 App\Http\Controllers\Auth\LoginController.php中的注销函数

public function logout(){
return redirect('login')->with(Auth::logout());
}