web-dev-qa-db-ja.com

Laravel 5.4を使用してログアウトし、ログインページにリダイレクトする方法

Laravel 5.4を使用して、認証システムを実装しようとしています。 php artisanコマンドmake:authを使用してセットアップしました。レイアウトに従ってビューを編集しました。さて、ログアウトしようとすると、このエラーがスローされます

RouteCollection.php行161のNotFoundHttpException:

ログアウト方法を教えてください。

31
Y.EzzEldin

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 URLを使用してログアウトするか、logout buttonを作成した場合は、/logoutにhrefを追加できます。

104
Tauras

たとえ@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');
    }

次に、HTTP要求メソッドとしてlogoutrequiresPOSTに注意してください。これには多くの正当な理由がありますが、非常に重要なことは、この方法でクロスサイトリクエストフォージェリーを防ぐことができるということです。

したがって、私が指摘したところによると、これを実装する正しい方法は次のようになります。

<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() }}から挿入したことに注意してください!

41
Sid

コントローラで次を使用できます。

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

ルートでAuth :: logout()を呼び出すことでそれを行う別の方法があります

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

5.5で

追加

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

私のroutesファイルには問題なく動作します。

1
Beefjeff

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>
1
Jonathan Roy

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');
}