web-dev-qa-db-ja.com

Laravel 5でのログアウト後のブラウザの[戻る]ボタンのログインを防ぐ

私はLaravel 5を初めて使用し、簡単な認証ページを作成しようとしています。ログアウトリンクをクリックした後、ブラウザの[戻る]ボタンをクリックしてもまだログアウトできます。私の認証ミドルウェアプロセスに関して実際に見られるべきではないページのコンテンツを見るために、私はキャッシングを無効にすることでこれを防ぐことができると読んでいますが、これを行うにはどうすればよいですか?より良い方法?単にログアウトルートは

Route::get('logout', array('uses' => '[email protected]'));

ログアウト機能は次のとおりです。

public function logout() {
        Auth::logout(); // logout user
        Session::flush();
        Redirect::back();
        return Redirect::to('pages/login'); //redirect back to login
}
14
Tartar

ユーザーが戻るボタンをクリックすると、ユーザーはnotに実際にログインし、ブラウザーはそれが持つものをレンダリングしますcachedfrom前のページビュー。ユーザーwo n'tは、サーバー上のアプリケーションに対して認証されていないため、ログインが必要なものを操作したり操作したりすることができます。

ユーザーが戻るボタンをクリックすると、サーバーへの要求を行わないとして制御できません。

戻るボタンを使用して表示できるコンテンツは、ログイン中に既にアクセスしたものだけです。新しいものにアクセスしようとすると、アプリケーションに新しいリクエストが行われ、ミドルウェアがトリガーされ、ログインページにリダイレクトします。

この動作を本当に止めたい場合は、JavaScriptなどを使用してajaxリクエストを送信し、ユーザーがそのようにログインしているかどうかを確認できますが、セキュリティの観点からはまったく役に立たないでしょう。

29
Wader

このソリューションは機能します!アーティザンを使用してミドルウェアを作成します。

php artisan make:middleware RevalidateBackHistory

RevalidateBackHistoryミドルウェア内で、ヘッダーをno-cacheに設定して再検証します。

<?php
namespace App\Http\Middleware;
use Closure;
class RevalidateBackHistory
{
    /**
    * Handle an incoming request.
    *
    * @param \Illuminate\Http\Request $request
    * @param \Closure $next
    * @return mixed
    */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        return $response->header('Cache-Control','nocache, no-store, max-age=0, must-revalidate')
            ->header('Pragma','no-cache')
            ->header('Expires','Fri, 01 Jan 1990 00:00:00 GMT');
    }
}

Kernel.phpでアプリケーションのルートミドルウェアを更新する

protected $routeMiddleware = [
    .
    .
    'revalidate' => \App\Http\Middleware\RevalidateBackHistory::class,
    .
    .
];

そしてそれだけです!したがって、基本的には、ユーザー認証を必要とするルートの再検証ミドルウェアを呼び出すだけです。

33
RaZik

ステップ1:次のコマンドを使用してミドルウェアを1つ作成します。

php artisan make:middleware PreventBackHistory

ステップ2:

preventBackHistory.phpのコンテンツを次のコンテンツに置き換えます。

<?php

namespace App\Http\Middleware;

use Closure;

class PreventBackHistory
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        return $response->header('Cache-Control','no-cache, no-store, max-age=0, must-revalidate')
            ->header('Pragma','no-cache')
            ->header('Expires','Sun, 02 Jan 1990 00:00:00 GMT');
    }
}

ステップ3:kernal.phpにミドルウェアを登録する

'preventBackHistory' => \App\Http\Middleware\PreventBackHistory::class,

そして行くのは良い:)

11
Payal

私が使用した方法は、ログアウト後に前のページに単純にリダイレクトすることです。前のページが保護されている限り、認証ミドルウェアが起動してログインページにリダイレクトします。戻るボタンをクリックすると、前のページはキャッシュされなくなり、ログインページが再び表示されます。

元のディスカッション: https://laracasts.com/discuss/channels/requests/back-button-browser

public function logout() {
        Auth::logout(); // logout user
        return redirect(\URL::previous());
}
8
sitesense

authミドルウェアで保護されたルートにリダイレクトしてみてください:

return redirect('home');

そのため、ログインページへのリダイレクトが強制され、戻るボタンは前のページを表示しません

0
emonik