2015-05-08 305 views
6

我是新來的Laravel 5,並試圖做一個簡單的認證頁面。我的問題是,我點擊註銷鏈接後,我可以正常註銷,但如果我點擊返回瀏覽器的按鈕,仍然能夠看到實際上不應該看到我的auth中間件進程的頁面內容。我讀我可以通過禁用緩存來防止這種情況,但不要認爲這是做這件事的最好方法,那我該如何以更好的方式做到這一點?只要我的退出路徑是避免瀏覽器的後退按鈕登錄註銷後在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 
} 
+0

你能證明你的註銷代碼,而不是隻路線 – xenish

+0

如果要清除高速緩存中有你試圖緩存::刷新() – xenish

+0

@xenish檢查編輯的問題,請,我已經把它 – Tartar

回答

17

當用戶單擊後退按鈕他們實際登錄的,它只是在瀏覽器中呈現它有什麼緩存來自上一頁的意見的。用戶不會能夠導航或與需要它們登錄的任何內容進行交互,因爲對於您的服務器上的應用程序,它們未經過身份驗證。

當用戶點擊你在沒有控制,它不會使服務器的請求後退按鈕。

使用返回按鈕,他們將能夠查看的唯一內容是什麼,他們已經訪問過,同時登錄。如果他們試圖訪問任何新的東西,他們會成爲一個新的請求您的應用程序,你的中間件會觸發並重定向到登錄頁面。

我想如果你真的想停止這種行爲,你可以使用一些JavaScript等來發送ajax請求,並檢查用戶是否以這種方式登錄,但從安全的角度來看是無用的。

+1

最好的解釋。 :) –

+3

雖然這個答案很好解釋發生了什麼,但並不能真正解決問題。假設用戶正在查看敏感數據,註銷並離開。其他人坐在電腦前,點擊後退按鈕。他們將能夠看到敏感數據。這似乎是一個巨大的安全問題。我認爲以下關於強制重新驗證的答案之一是更合適的。 –

1

我用的方法是簡單地重定向到前一頁註銷後。 只要上一頁得到保護,auth中間件就會啓動並將您重定向回登錄頁面。現在,當您單擊後退按鈕時,上一頁不再被緩存,您只需再次獲取登錄頁面。

原文討論:https://laracasts.com/discuss/channels/requests/back-button-browser

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

這不起作用,如果用戶點擊回來不止一次 – user3494047

0

嘗試重定向到一個受保護的路徑與AUTH中間件:

return redirect('home'); 

所以它會迫使重定向到登錄頁面&後退按鈕不會顯示前一頁

17

該解決方案是工程! 使用工匠創建中間件。

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, 
. 
. 
]; 

和應用程序的路線中間件這一切!所以基本上你只需要爲需要用戶認證的路由調用重新驗證中間件。

+0

爲我工作!謝謝 –

4

步驟1:使用下列命令創建一箇中間件:

php artisan make:middleware PreventBackHistory 

步驟2:

<?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::

與以下內容替換PreventBackHistory.php的內容登記中間件in kernal.php

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

又好走:)

+0

步驟4:在您的控制器的構建器中使用中間件 public function __construct() {this-> middleware('preventBackHistory'); \t \t $ this-> middleware('auth'); } – Payal

相關問題