2017-04-14 96 views
0

我是Laravel的新手,爲多個用戶構建網站,在其中一個網頁上列出與登錄用戶相關的項目,允許用戶點擊某個項目,然後在下一頁上查看或編輯細節。非常簡單的概念,但我想知道何時由Laravel提供詳細信息頁面,如何簡單可靠地知道哪個項目被點擊並顯示正確項目的詳細信息。Laravel 5.4:如何在頁面瀏覽中安全地跟蹤所選項目?

解決此問題的一個顯而易見的方法是在詳細信息頁面的URL中指定項目的主鍵ID - 即爲第一頁上的列表中的每個項目指定項目的主鍵ID,然後指定使用該項目返回正確的項目:

Route::get('/itemdetails/{ID}', '[email protected]'); 

然後顯然使用指定的ID來做數據庫查找。 問題是,這是完全不安全的,即任何用戶都可以在ID字段中嘗試不同的數字並訪問其他用戶的項目詳細信息。

那麼,如何以一種用戶無法僞造的身份證等做到這一點牢固Laravel? 我在想什麼會議或ID的散列或什麼東西,但不知道如何實際執行此操作。

由於我是新手,源代碼或特定細節非常感謝!

非常感謝。

回答

2

任何放在URL作爲標識符可以被破解,某種形式的散列可以慢下來(顯著),但不會解決你的問題,這將是更好地爲您使用「正確」的認證。
在控制器內部,您可以檢查用戶是否有權訪問指定的頁面。

public function showitemdetailpage($ID){ 
    $someModel = MyModel::find($ID); 
    if($someModel->user_id == Auth::user()->id){ 
     return view('myawesomeview', ['detail' => $someModel]); 
    } 
    abort(404); 
} 

我選擇了這裏的404錯誤,以防止其他用戶即使發現如果一個指定detailPage存在,你也可以返回403狀態代碼(不允許)。這會讓其他用戶知道該詳細信息頁面存在但不能被他們訪問。

通過阻止訪問而不是混淆ID,您可以確保沒有人可以訪問該頁面,即使他們確實擁有該URL(當然這隻有在認證正確實施的情況下才有效)。

我的例子只有一種方法來檢查身份驗證Laravel有一個精心製作的方法來授權人員和操作,使用他們的門可以閱讀更多here

+0

很好。很好的解決方案,謝謝:) –

0

會話是安全存儲這類信息的最佳方式!您可以使用session()->put('key','value')在會話中添加值。這意味着您可以根據需要輸入儘可能多的值!它將安全地存儲您的數據,因爲Laravel會將其存儲在我認爲的文件中!

您可以通過登錄除外信息(session()->forget('key'))去除一切清除會話值時,你不需要在特定會話的值,也可以在陣列存儲,並刪除整個陣列時不再需要它!我也一樣將服務器的ID存儲在我的系統中,因爲一個用戶可以管理多臺服務器!

讓我知道這是否有幫助!

+0

謝謝,但與會話,我不看我怎麼跟蹤用戶點擊了哪些項目(讓服務器拉起了正確的細節記錄),以及如何防止用戶訪問其他用戶的項目細節,他們'沒有授權看?謝謝 –

0

如果你使用內置的Laravel AUTH你可以在你的控制器的頂部用一個簡單的構造函數,記得使用use Auth; ,如果它是一個乾淨的安裝,你也必須運行php artisan make:auth

use Auth; 

class WhateverController extends Controller 
{ 
    public function __construct() 
     { 
      $this->middleware('auth', ['except' => 'logout']); 
     } 

    ... Your Controller code 

這將允許(除了註銷)只有權限的訪問(即在Laravel默認設置爲用戶)

+0

謝謝。這將確保非用戶無法查看詳細信息頁面(即公開發布),但它不會阻止一個用戶查看其他用戶的詳細信息頁面 - 因爲它們都將被登錄/授權。 –

相關問題