私はLaravel 5を初めて使用し、簡単な認証ページを作成しようとしています。ログアウトリンクをクリックした後、ブラウザの[戻る]ボタンをクリックしてもまだログアウトできます。私の認証ミドルウェアプロセスに関して実際に見られるべきではないページのコンテンツを見るために、私はキャッシングを無効にすることでこれを防ぐことができると読んでいますが、これを行うにはどうすればよいですか?より良い方法?単にログアウトルートは
Route::get('logout', array('uses' => 'LoginController@logout'));
ログアウト機能は次のとおりです。
public function logout() {
Auth::logout(); // logout user
Session::flush();
Redirect::back();
return Redirect::to('pages/login'); //redirect back to login
}
ユーザーが戻るボタンをクリックすると、ユーザーはnotに実際にログインし、ブラウザーはそれが持つものをレンダリングしますcachedfrom前のページビュー。ユーザーwo n'tは、サーバー上のアプリケーションに対して認証されていないため、ログインが必要なものを操作したり操作したりすることができます。
ユーザーが戻るボタンをクリックすると、サーバーへの要求を行わないとして制御できません。
戻るボタンを使用して表示できるコンテンツは、ログイン中に既にアクセスしたものだけです。新しいものにアクセスしようとすると、アプリケーションに新しいリクエストが行われ、ミドルウェアがトリガーされ、ログインページにリダイレクトします。
この動作を本当に止めたい場合は、JavaScriptなどを使用してajaxリクエストを送信し、ユーザーがそのようにログインしているかどうかを確認できますが、セキュリティの観点からはまったく役に立たないでしょう。
このソリューションは機能します!アーティザンを使用してミドルウェアを作成します。
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,
.
.
];
そしてそれだけです!したがって、基本的には、ユーザー認証を必要とするルートの再検証ミドルウェアを呼び出すだけです。
ステップ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,
そして行くのは良い:)
私が使用した方法は、ログアウト後に前のページに単純にリダイレクトすることです。前のページが保護されている限り、認証ミドルウェアが起動してログインページにリダイレクトします。戻るボタンをクリックすると、前のページはキャッシュされなくなり、ログインページが再び表示されます。
元のディスカッション: https://laracasts.com/discuss/channels/requests/back-button-browser
public function logout() {
Auth::logout(); // logout user
return redirect(\URL::previous());
}
authミドルウェアで保護されたルートにリダイレクトしてみてください:
return redirect('home');
そのため、ログインページへのリダイレクトが強制され、戻るボタンは前のページを表示しません