信息
您可以輕鬆更改數據庫中的所有其他字段並將其用於身份驗證。唯一的問題是password
字段。
實際上password
字段在某種程度上是用Laravel硬編碼的(但不是很多人認爲的),所以當你傳遞你的問題時你不能傳遞數組。
默認情況下,如果你通過數組attempt
(可能其他驗證功能,如validate
或once
)如果你這樣做是這樣的:
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";
});
- 在
app/config/database.php
- 立即創建空數據庫並設置連接數據可以例如
http://localhost/yourprojectname/db
只是爲了創造用戶運行/db
網址表。
- 現在你可以例如
http://localhost/yourprojectname/
運行/
網址 - 正如你看到的用戶登錄,即使在數據庫表users
你沒有任何password
列(認證數據已經爲無任何形式的,但當然字符串傳遞在實際應用中,您將添加它們)。您可以再次運行此網址 - 因爲您看到用戶仍然登錄,因此它按預期工作。
- 如果你點擊
Log out
鏈接,你將被註銷
Laravel 5個變更爲上述
將此溶液Larave 4.2.9測試(如高於一切),以及在Laravel 5。在Laravel5一切正常相同,但您在不同的路徑需要當然編輯文件:
User
模型是app/User.php
文件
- 條路線是
app/Http/routes.php
文件
- 數據庫配置文件是在
config/database.php
文件
@JarekTkaczyk這是真的,但對於用戶沒有資料沒有誰希望有自定義密碼列在數據庫中。 OP提到只是使用'getAuthPassword',但對於正在尋找解決方案的用戶,他仍然不知道該怎麼做。我認爲這個問答有助於其他用戶逐步解決這個問題 – 2014-09-27 12:48:08
只是一個提示 - 大多數情況下,最有價值的答案就是那些簡短而且正確的答案,這正是解決問題的方法。 – 2014-09-27 13:34:22
@MarcinNabiałek你救了我的生命這個愚蠢的自定義字段在我的項目中一直在驅動着我的香蕉 – caro 2017-01-05 12:29:07