2014-10-30 34 views
1

你能幫助我嗎?我正在使用Laravel構建我自己的登錄表單。但我有一個問題,因爲我使用哈希方法存儲我的密碼,並在我的登錄表單中再次使用哈希方法進行比較。但是我發現散列值總是在變化。如何使用自定義登錄表單比較Laravel的散列密碼?

這是我在航線代碼:

Route::post('/admin_handle_login', function() 
{ 

    $rules = array(
     'admin_username' => 'required', 
     'admin_password' => 'required' 
    ); 

    $validate_admin_login = Validator::make(Input::all(), $rules); 

    if($validate_admin_login->fails()) { 

     $messages = $validate_admin_login->messages(); 

     Session::flash('warning_notification','Error: Incomplete details!'); 

     return Redirect::to('/flaxadmin') 
          ->withErrors($messages) 
          ->withInput(Input::except('admin_password')); 

    } else { 

     $d = array(
      Input::get('admin_username'), Hash::make(Input::get('admin_password')) 
     ); 

     $validate_admin = DB::table('administrators') 
          ->select('username') 
          ->where('username', Input::get('admin_username')) 
          ->where('password', Hash::check('password', Input::get('admin_password'))) 
          ->count(); 
     fp($d); 
     fp($validate_admin); 

    } 

}); 

結果是

Array 
(
    [0] => admin002 
    [1] => $2y$10$RTwKHN9W1/unu1ZhYlNjauApJjjoNTBnE6td/AZ5jWgZEdqVav0um 
) 
0 

在我的數據庫admin002的密碼是

$2y$10$47sSXLzh/YXN6Rf2fmljYO7lZaxfhXVSUTp5bssR2gYQ6Nw9luUH2 

是我的代碼錯了嗎?或者有沒有適當的方法來做到這一點?我是Laravel的一個初學者。

+0

您將需要做的是使用該用戶名查找數據庫中的所有用戶。那麼你將不得不檢查每個帳戶的密碼。 – Jerodev 2014-10-30 08:31:31

+0

我知道。但是我使用了散列函數,並且每當頁面重新加載或刷新時都會隨時更改。因此,如果我使用123作爲密碼,並且在我的數據庫中也是123,但它們是不同的散列值。這就是爲什麼我無法得到確切的價值 – Jerielle 2014-10-30 08:38:45

回答

4

首先,你不能這樣做。假設username是獨一無二的,你應該做的:

$validate_admin = DB::table('administrators') 
          ->select('username') 
          ->where('username', Input::get('admin_username')) 
          ->first(); 

if ($validate_admin && Hash::check(Input::get('admin_password'), $validate_admin->password)) { 
    // here you know data is valid 
} 

但是你應該考慮使用,而內置的方法比你的編碼它。你有Auth::attemptAuth::validate如果你想登錄/只檢查用戶的密碼,所以真的不需要自己編碼。

+0

如果沒有用戶存在,會發生什麼? – 2014-10-30 08:48:46

+0

@DanielGelling我在if語句 – 2014-10-30 08:50:01

+0

的開頭添加了'$ validate_admin &&'Ok我已經使用過模型USER,但我不知道如何更改或覆蓋模型USER中的表格。我所知道的是Auth :: validate正在使用User模型類。我在我的客戶帳戶中使用了它,並且它正在工作,所以我決定爲我的管理帳戶創建另一個登錄名 – Jerielle 2014-10-30 08:51:53

2

這裏您正在使用輸入密碼的散列版本檢查字符串'password'。

因此,請嘗試通過用戶名獲取用戶,如果您有結果,您可以將存儲在數據庫中的密碼的散列版本與輸入密碼進行比較。像這樣:

$user = DB::table('administrators') 
     ->select('username', 'password') 
     ->where('username', Input::get('admin_username'); 

if($user->count()) { 
    $user = $user->first(); 
    if(Hash::check(Input::get('admin_password', $user->password)) { 
     //User has provided valid credentials :) 
    } 
}