2014-09-27 68 views
10

我想在使用Laravel認證時更改數據庫中的密碼字段。我希望我的列在users表中有名稱passwd而不是password。我試圖運行這樣的事情:如何更改Laravel 4和Laravel 5用戶認證的自定義密碼字段名稱

Auth::attempt(array(
    'user_name' => 'admin', 
    'passwd' => 'hardpass', 
)); 

但它不起作用。

我也試圖在User模型添加以下功能:

public function getAuthPassword() { 
    return $this->passwd; 
} 

但它也改變不了什麼。用戶仍未被認證。在Laravel中可以更改數據庫中的密碼字段名稱嗎?

+0

@JarekTkaczyk這是真的,但對於用戶沒有資料沒有誰希望有自定義密碼列在數據庫中。 OP提到只是使用'getAuthPassword',但對於正在尋找解決方案的用戶,他仍然不知道該怎麼做。我認爲這個問答有助於其他用戶逐步解決這個問題 – 2014-09-27 12:48:08

+1

只是一個提示 - 大多數情況下,最有價值的答案就是那些簡短而且正確的答案,這正是解決問題的方法。 – 2014-09-27 13:34:22

+0

@MarcinNabiałek你救了我的生命這個愚蠢的自定義字段在我的項目中一直在驅動着我的香蕉 – caro 2017-01-05 12:29:07

回答

45

信息

您可以輕鬆更改數據庫中的所有其他字段並將其用於身份驗證。唯一的問題是password字段。

實際上password字段在某種程度上是用Laravel硬編碼的(但不是很多人認爲的),所以當你傳遞你的問題時你不能傳遞數組。

默認情況下,如果你通過數組attempt(可能其他驗證功能,如validateonce)如果你這樣做是這樣的:

Auth::attempt(array(
    'user_name' => 'admin', 
    'password' => 'hardpass', 
)); 

默認雄辯驅動程序將運行下面的查詢:

select * from `users` where `user_name` = 'admin' limit 1; 

從數據庫中獲取此數據後,它將比較您爲創建的用戶對象提供的密碼屬性。

但如果你只是使用:

Auth::attempt(array(
    'user_name' => 'admin', 
    'passwd' => 'hardpass', 
)); 

下面的查詢將運行:

select * from `users` where `user_name` = 'admin' and `passwd` = 'hardpass' limit 1; 

,沒有用戶會在數據庫中(在passwd您存儲哈希密碼)被發現。這是因爲Eloquent從查詢password中刪除,但使用任何其他數據來運行查詢。此外,如果您嘗試使用'passwd' => Hash:make($data['password'])(儘管用戶將被發現),則比較密碼將不起作用。

解決方案

解決方案很簡單。您需要運行Auth::attempt這樣的:

Auth::attempt(array(
    'user_name' => 'admin', 
    'password' => 'hardpass', 
)); 

正如你看到的,你仍然可以通過password爲重點(雖然這列不會users表中未退出),因爲只有這樣洋洋灑灑驅動程序將不使用它構建查詢。

現在User模型(app/models/User.php)文件,你需要添加以下功能:

public function getAuthPassword() { 
    return $this->passwd; 
} 

正如你在這裏看到你使用確實存在於數據庫中的列:passwd

通過這種方式使用它,您可以使用密碼列命名任何你想要的,你仍然可以使用默認的Eloquent驅動程序。

要測試的示例數據

我已經爲它創建了非常簡單的測試。

你只需要使用以下替換您的app/routes.php文件:

Route::get('/', function() { 

    if (Auth::check()) { 
     echo "I'm logged in as " . Auth::user()->user_name . "<br />"; 
     echo "<a href='/logout'>Log out</a>"; 
    } else { 
     echo "I'm NOT logged in<br />"; 


     Auth::attempt(array(
      'user_name' => 'admin', 
      'password' => 'hardpass', 
     )); 


     if (Auth::check()) { 
      echo "Now I'm logged in as " . Auth::user()->user_name . "<br />"; 
      echo "<a href='/logout'>Log out</a>"; 
     } else { 
      echo "I'm still NOT logged in<br />"; 
     } 
    } 


}); 

Route::get('/logout', function() { 
    Auth::logout(); 
    return "You have been logged out"; 
}); 


Route::get('/db', function() { 

    if (!Schema::hasTable('users')) { 


     Schema::create('users', function ($table) { 
      $table->engine = 'InnoDB'; 
      $table->increments('id'); 
      $table->string('user_name', 60)->unique(); 
      $table->string('passwd', 256); 
      $table->rememberToken(); 
      $table->timestamps(); 
     }); 

     DB::table('users')->insert(
      [ 
       [ 
        'user_name' => 'admin', 
        'passwd' => Hash::make('hardpass'), 
       ] 
      ] 
     ); 
    } 

    echo "Table users has been created"; 
}); 
  1. app/config/database.php
  2. 立即創建空數據庫並設置連接數據可以例如http://localhost/yourprojectname/db只是爲了創造用戶運行/db網址表。
  3. 現在你可以例如http://localhost/yourprojectname/運行/網址 - 正如你看到的用戶登錄,即使在數據庫表users你沒有任何password列(認證數據已經爲無任何形式的,但當然字符串傳遞在實際應用中,您將添加它們)。您可以再次運行此網址 - 因爲您看到用戶仍然登錄,因此它按預期工作。
  4. 如果你點擊Log out鏈接,你將被註銷

Laravel 5個變更爲上述

將此溶液Larave 4.2.9測試(如高於一切),以及在Laravel 5。在Laravel5一切正常相同,但您在不同的路徑需要當然編輯文件:

  1. User模型是app/User.php文件
  2. 條路線是app/Http/routes.php文件
  3. 數據庫配置文件是在config/database.php文件