2016-10-11 49 views
0

我正在配置一個框架中的標誌,我現在每次都使用它。但是,由於某些原因,$tryagain錯誤仍在填充。我知道我的數據庫中的信息是正確的,我甚至編輯了數據庫中的密碼以刪除散列以消除這個問題。不從表中讀取信息的表格

有沒有人有一個線索,爲什麼它一直拋出再次嘗試錯誤說信息是錯誤的?我可以註冊一個用戶,然後將他們重定向到此頁面以允許他們登錄,因此登錄是唯一的問題。

如果您需要框架中的更多代碼,請讓我知道。我不想發佈大量的代碼。

ini_set('display_errors', 1); 
error_reporting(E_ALL); 
require_once 'core/init.php'; 

if(Input::exists()) { 
    if(Token::check(Input::get('token'))) { 

     $validate = new Validate(); 
     $validation = $validate->check($_POST, array(
      'username' => array('required' => true), 
      'password' => array('required' => true) 
     )); 

     if($validation->passed()) { 
      $user = new User(); 

      $remember = (Input::get('remember') === 'on') ? true : false; 
      $login = $user->login(Input::get('username'), Input::get('password'), $remember); 
      //var_dump($login); 

      if($login) { 
       Redirect::to('index'); 
      } else { 
       echo $tryagain = '<span class="signinpanel">' . "The information you entered did not match our records." . '</span>'; 
      } 

     } else { 
      foreach($validation->errors() as $error) { 
       echo $error, '<br>'; 
      } 
     } 
    } 
} 

形式

<?php 
    if(Session::exists('home')) { 
     echo '<p>' . Session::flash('home') . '</p>'; 
    } 
?> 
<form name="Sign In" action="" method="POST" autocomplete="on" accept-charset= "utf-8"> 
     <div class="field"> 
      <label for="username">Username</label> 
      <input type="text" name="username" autocomplete="on" required> 
     </div> 
     <div class="field"> 
      <label for="password">Password</label> 
      <input type="password" name="password" autocomplete="off" required> 
     </div> 
     <div class="field"> 
      <label for="remember"> 
      <input type="checkbox" name="remember" id="remember"> Remember me 
      </label> 
     </div><br> 
     <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"> 
     <input type="submit" value="Sign In"> 
    </form> 

登錄功能

public function login($username = null, $password = null, $remember = false) { 

if(!$username && !$password && $this->exists()) { 
    Session::put($this->_sessionName, $this->data()->id); 
} else { 
    $user = $this->find($username); 

    if($user) { 
     if($this->data()->password === Hash::make($password, $this->data()->salt)) { 
      Session::put($this->_sessionName, $this->data()->id); 

      if($remember) { 
       $hash = Hash::unique(); 
       $hashCheck = $this->_db->get('users_session', array('user_id', '=', $this->data()->id)); 

       if(!$hashCheck->count()) { 
        $this->_db->insert('users_session', array(
         'user_id' => $this->data()->id, 
         'hash' => $hash 
        )); 
       } else { 
        $hash = $hashCheck->first()->hash; 
       } 

       Cookie::put($this->_cookieName, $hash, Config::get('remember/cookie_expiry')); 
      } 
      return true; 
     } 
    } 

} 
return false; 

}

散列文件

class Hash { 
    public static function make($string, $salt = '') { 
     return hash('sha256', $string . $salt); 
    } 

    public static function salt($length) { 
     return mcrypt_create_iv($length); 
    } 

    public static function unique() { 
     return self::make(uniqid()); 
    } 
} 
+0

懷疑答案在於登錄方法。嘗試設置該函數顯式返回一個「true」來檢查問題不在您上面粘貼的代碼中。 –

+0

@GrahamNicol在這種情況下,我怎麼能做到這一點? – Becky

+0

我將我的登錄功能添加到了我的問題中。 – Becky

回答

1

我認爲你的錯誤就在於檢查你在這裏做:

if($this->data()->password === Hash::make($password, $this->data()->salt)) { 
     Session::put($this->_sessionName, $this->data()->id); 

如果我讀這正確的你正在服用的值用戶輸入並隨後用新創建密碼的一個品牌新的Hash隨機加入的鹽。每次代碼執行時該值都會改變,但是(非常)不可能與輸入密碼相同。

最初,這個答案是基於Laravel庫:

而不是使用Hash:make使用Hash::check作爲保護進入該塊:

if(Hash::check($this->data()->password, $password)){ 
     Session::put($this->_sessionName, $this->data()->id); 

這應該給一個途徑,讓login()函數返回true

然而,隨着@becky表示,他們沒有使用Laravel需要一個更普遍的答案:

,你必須是你正在檢查對加密(散列)密碼明文密碼的基本問題。在所有優秀的算法中,這不會是同一件事,這就是爲什麼它永遠不會從函數返回true的原因。

您需要做的是檢查用戶輸入的散列版本:Hash::make($password, $this->data()->salt)與您存儲的值(因爲您只存儲散列版本)。如果您可以更改代碼以比較這兩個值,則它們應該是相同的,因此身份運算符===將返回true值。

進一步的討論,以及一些調試,表明什麼是未來從數據庫中回沒有什麼被在頁面上由

Hash::make($password, $this->data()->salt) 

語句創建的。仔細觀察後發現,db的列長度從64個字符減少到了50個。由於Hash::make()函數返回了64個字符的散列值,所以這兩個值永遠不會相等。重新創建該數據庫列並重新生成密碼哈希解決了問題。

+0

謝謝。它雖然拋出了這個錯誤:'致命的錯誤:調用未定義的方法Hash :: check()' – Becky

+0

道歉,這是來自Auth包的Laravel函數,所以會是Auth :: check()。有更多的工作示例[這裏](https://laravel.com/docs/5.3/authentication#retrieving-the-authenticated-user) –

+0

那麼我的框架似乎試圖打開一個Auth文件,現在使用'if(Auth ::檢查($ this-'。錯誤:'警告:require_once(classes/Auth.php):未能打開流:N'我將我的散列文件添加到我的問題中 – Becky