Laravel 5 Auth Logoutがセッションを破壊しない

新しいプロジェクトにLaravel5認証システムを使用しています。問題なく登録およびログイン機能を使用できますが、ログアウトが期待どおりに機能しません。ただし、 $ redirectAfterLogout で指定されたURLにリダイレクトされます。ログアウトボタンを押してもセッションが破壊されないのでダッシュボードを見ることができます。

laravelの認証システムにバグがありますか。

12
セッションが破壊されたかどうか、どうやってわかりますか。 authで経路を制限しましたか?
追加された 著者 Sougata Bose,
@sgtログアウトリンクをクリックした後、/auth/login にアクセスできない場合、ダッシュボードにリダイレクトされます。
追加された 著者 seoppc,
私は同じ問題を抱えていました、私の間違いはミドルウェア "guest"をログアウトルートに入れたことです。//おそらくあなたは同じ問題を抱えている。
追加された 著者 Vagner do Carmo,

11 答え

あなたが使ったことのあるコードを提供していません。ただし、次のコードは機能します。

public function getLogout(){
        Auth::logout();
        Session::flush();
        return Redirect::to('/');
    }

Session :: flush(); は既存のすべてのセッションをクリアします。

13
追加された
私は現在Laravel 5の組み込み認証メカニズムを使用しています
追加された 著者 seoppc,
私は同じ問題を抱えていました、私の間違いはミドルウェア "guest"をログアウトルートに入れたことです。//おそらくあなたは同じ問題を抱えている。
追加された 著者 Vagner do Carmo,
だから私はあなたが今セッションを破壊することができると思いますか?
追加された 著者 Amita,

Laravel 5.2を使ってリスナーを登録し、ログアウトイベントを処理してSession :: flushを呼び出しました。かなりうまくいったようです。これが役に立つことを願っています。

EventServiceProvider.php

protected $listen = [
    'App\Events\SomeEvent' => [
        'App\Listeners\EventListener',
    ],
    'Illuminate\Auth\Events\Logout' => [
        'App\Listeners\ClearSessionAfterUserLogout'
    ],
]; 

ClearSessionAfterUserLogout.php

public function handle(Logout $event)
{
    Session::flush();
}
6
追加された
私は同じ問題を抱えていました、私の間違いはミドルウェア "guest"をログアウトルートに入れたことです。//おそらくあなたは同じ問題を抱えている。
追加された 著者 Vagner do Carmo,

データベースセッションドライバに切り替え、ログアウトアクションで次のコードを使用しました

$request->session()->getHandler()->destroy($request->session()->getId());
1
追加された

私は同じ問題を抱えていました、そして私はすべてを試みました、しかし結局私はそれを直すことができました。

私の問題は、ログアウトボタンを押したとき、その前にまだ応答していないhttp要求がいくつかあったため、ユーザーがログアウトしたときでも、保留中の要求の応答で後でログインしたことです。これが一例です。

Another Request |   ***********************************
Logout Request  |          ********************
                |
Time            | --|------|-------------------|------|------>
                   t1      t2                  t3     t4

それで、それらの答えられなかった要求を取り除くことは私のために働きました。この回答が役に立つことを願っています:)

1
追加された
未回答のリクエストを削除する場所
追加された 著者 leonardeveloper,
私の場合、いくつかのJQuery ajax呼び出しでそれらの要求を見つけたので、そのコードを削除したところ、ログアウトは期待通りに機能し始めました。私はこれを手伝ってくれることを願っています:)
追加された 著者 dani24,

/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php ...関数getLogout()に到達していないため、logout()メソッドが起動しません。

私の場合、私の/app/Http/routes.php ...ではなく、 "Route :: get( 'auth/logout'、 'Auth \ AuthController @ getLogout');"のようにします「Route :: get( 'auth/logout'、 'Auth \ AuthController @ logout');」に変更しました。

1
追加された
ちなみにこの解決策はLaravel 5.2.29用です。多分バージョンは舞台裏でわずかな改訂があります
追加された 著者 Frederick G. Sandalo,

トレイトAuthenticatesUsers

public function logout(Request $request)

これを変える

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

これに

$request->session()->regenerate(true);
1
追加された
出来た。ありがとう。
追加された 著者 Mahfuzul Alam,

AuthController.phpのlogoutメソッドを単に上書きすることができます

これがサンプルコードです。

public function logout(){
        Session::flush();
        Auth::guard($this->getGuard())->logout();
        return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
    }
1
追加された

In your case you are not probably reaching the logout() method. If you are using Laravel 5 builting auth mechanism then you will run AuthenticatesAndRegistersUsers trait getLogout() method which does $this->auth->logout();

このコードを見つけて、デバッグのために以下のようにメソッドを編集してください。文字列 "Logging out"が表示されたら、ログアウトしている必要があります。それ以外の場合は、ルーティングに問題があり、ログアウトは決して実行されません。

/**
 * Log the user out of the application.
 *
 * @return \Illuminate\Http\Response
 */
public function getLogout()
{
    dd("Logging out");
    $this->auth->logout();

    return redirect('/');
}
0
追加された
他の選択肢はあなたがあなたのアカウントを覚えているということかもしれません。 logout()呼び出しの前後にユーザーのログインステータスを確認してください。 dd($ this-> auth-> user())を使うことができます。このため。これは、ユーザーがログインしたかどうか、そしてログアウト後ではないかどうかを確実に示します
追加された 著者 Margus Pala,
将来のある時点で、ユーザーはログインし直されていたはずです。コントローラーのgetLogin()メソッドをチェックして、正確にどこにアクセスするのかを調べる必要があります
追加された 著者 Margus Pala,
はい、ログアウトリンクをクリックすると画面に「ログアウト」と表示されます。つまり、ログアウトリンクがこの機能を使用しています。
追加された 著者 seoppc,
このテストを試したところ、呼び出し後に空になったので、 auth-> user()は破棄されますが、ログアウト後もログインページがダッシュボードにリダイレクトされるのはなぜですか。
追加された 著者 seoppc,

私はこれと戦ってきました、そして私は解決策を見つけました。

要するに、Laravelセッションはミドルウェアを使って読み書きします。リクエストの開始時に保存されたセッションを読み込み、リクエストの終了時に変更を書き込みます。リダイレクトすると、現在のリクエストは完了せず、ミドルウェアの書き込みは行われません。

だから、これを修正するには?実装によっては、直接呼び出すのではなく、リダイレクトコマンドを return してください。

return redirect($redirectAfterLogout)
0
追加された

私は同様の問題に遭遇しました、そして、それは後でどうしても修正することができなかったファイルを作成していたセッションに「ファイル」ドライバを使用することが判明しましたが、ファイル許可警告はありませんでした。私はredisの実装に切り替えたので、残念ながらファイル作成の問題を解決する方法を言うことはできませんが、これは誰かに時間を節約するかもしれないと思いました。

0
追加された

コントローラアクションでリクエストオブジェクトを受け入れることで(コントローラ名前空間宣言の後にこれを追加することを忘れないでください:認証を使用する

 /**
 *
 * Render page
 *
 * @route POST /user/{user_id}/logout
 *
 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
 */
public function logout(Request $request) {
    Auth::logout();
    $request->session()->flush();
}
0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com