[英]How to logout and redirect to login page using Laravel 5.4?
我正在使用 Laravel 5.4 并尝试实施身份验证系统。 我使用 php artisan 命令 make:auth 来设置它。 我根据我的布局编辑了视图。 现在,当我试图注销时,它抛出了这个错误
RouteCollection.php 第 161 行中的 NotFoundHttpException:
谁能帮我如何注销?
在您的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
,或者如果您创建了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>
最后请注意,我已经插入了 laravel 开箱即用的函数{{ csrf_field() }}
!
您可以在控制器中使用以下内容:
return redirect('login')->with(Auth::logout());
Laravel 5.8 的最佳方式
100% 工作
在你的Auth\\LoginController.php 中添加这个函数
use Illuminate\Http\Request;
并添加这个
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
return $this->loggedOut($request) ?: redirect('/login');
}
这是通过在路由中调用 Auth::logout() 来实现的另一种方法
Route::get('/logout', function(){
Auth::logout();
return Redirect::to('login');
});
我建议你在 web.php 中坚持使用 Laravel auth 路由: 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>
在 5.5
添加
Route::get('logout', 'Auth\\LoginController@logout');
到我的路由文件工作正常。
在 Laravel 6.2 中
将以下路由添加到: web.php
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
使用带有使用 POST 表单注销的 Achor 标签。 这样,您还需要 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>
如果您在 5.5 中使用了 auth 脚手架,只需将您的href
指向:
{{ route('logout') }}
无需更改任何路由或控制器。
将以下代码添加到 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 提出的。 我想分享我的Laravel 8.65版本解决方案。 在AuthenticatedSessionControler 中像这样更新销毁函数。
public function destroy(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/admin');
}
将最后一行从return redirect('/')
为return redirect('/admin');
go 到路由目录打开 web.php 并写入注销路由:
use App\Http\Controllers\Auth\LoginController;
Route::get('logout', [LoginController::class,'logout']);
从刀片添加注销 URL
<a class="dropdown-item" href={{route('logout')}}>Logout</a>
注销 function 将重定向到主页/
如果你想重定向到登录页面,你应该在App\Http\Controllers\Auth\LoginController.php
中覆盖注销 function
public function logout(){
return redirect('login')->with(Auth::logout());
}
以防万一有人对此主题感兴趣,请致电 Laravel 8 或 9。
正如您可以在 https 上阅读 Laravel 文档一样://laravel.com/docs/9.x/authentication#logging-out
除了 Auth::logout() 之外,您还需要使用户的 session 无效并重新生成他们的 CSRF 令牌:
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.