我正在使用Laravel 5.4并尝试实现身份验证系统。我使用php artisan命令make:auth来设置它。我根据我的布局编辑了视图。现在,当我试图注销它时,把这个错误抛给了我
RouteCollection.php第161行中的NotFoundHttpException:
任何人都可以帮我注销吗?
答案 0 :(得分:88)
在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;
use Illuminate\Http\Request;
现在,您可以使用yourdomain.com/logout
网址退出,或者如果您已创建logout button
,请将href添加到/logout
答案 1 :(得分:37)
即使@Tauras的建议有效,我也不认为这是解决这个问题的正确方法。
你说你已经运行了php artisan make:auth
,它应该在Auth::routes();
路由文件中插入routes/web.php
。其中包含已定义的默认logout
路由,其名称为logout
。
您可以see it here on 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>
最后请注意,我已经插入了laravel开箱即用函数{{ csrf_field() }}
!
答案 2 :(得分:7)
您可以在控制器中使用以下内容:
return redirect('login')->with(Auth::logout());
答案 3 :(得分:4)
Laravel 5.8的最佳方法
100%工作
在您的 Auth \ LoginController.php
中添加此功能$.ajax({
type: "POST",
url: '/Home/CreateCarouselItem',
dataType: "text",
data: {itemText: boxText },
traditional: true,
success: function (data) {
console.log(data);
},
error: console.log("it did not work"),
});
还要添加
use Illuminate\Http\Request;
答案 4 :(得分:2)
这是通过在路由
中调用Auth :: logout()来实现此目的的另一种方法Route::get('/logout', function(){
Auth::logout();
return Redirect::to('login');
});
答案 5 :(得分:1)
在5.5
添加
Route::get('logout', 'Auth\LoginController@logout');
到我的路线文件工作正常。
答案 6 :(得分:1)
我建议您在web.php中坚持使用Laravel身份验证路由:Auth::routes()
它将创建以下路线:
POST | logout | App\Http\Controllers\Auth\LoginController@logout
您将需要使用POST表单注销。这样,您还需要推荐的CSRF令牌。
<form method="POST" action="{{ route('logout') }}">
@csrf
<button type="submit">Logout</button>
</form>
答案 7 :(得分:1)
在Laravel 6.2中
将以下路由添加到: web.php
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
使用Achor标记并通过POST表单注销。这样,您还将需要CSRF令牌。
<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>
答案 8 :(得分:0)
将以下代码添加到LoginController.php中更好,更安全,该代码仅在标准注销后运行:
use AuthenticatesUsers;
protected function loggedOut(Request $request)
{
return redirect('/new/redirect/you/want');
}
答案 9 :(得分:0)
如果您希望在特定条件下通过代码实现此目标,那么这是为我工作的解决方案。我在中间件中使用过,以阻止某些用户: 下面这些行是注销的实际代码:
$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);
}
}
答案 10 :(得分:-2)
如果您在5.5中使用了auth脚手架,只需将href
指向:
{{ route('logout') }}
无需更改任何路线或控制器。