繁体   English   中英

如何使用 Laravel 5.4 注销并重定向到登录页面?

[英]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');

在 Laravel 9

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM