[英]Laravel 4 Auth::attempt returns false on correct values
我有登錄代碼,該代碼應通過嘗試使用Laravel的Auth::attempt()
方法對用戶進行身份驗證來起作用。 該代碼在我的另一個站點上有效,我將其更改為數據庫中的passwdEncrypted
,而不是數據庫中的Password
。 我不能更改它,因為該數據庫也被另一個應用程序使用。
代碼如下:
// check if in database
$isInDb = User::where('ReferenceCode', $username)->first();
if($isInDb) {
// is in database
// check if password is encrypted yet
if($isInDb->passwdEncrypted) {
// password is encrypted
if(Auth::attempt(array('ReferenceCode' => $username, 'passwdEncrypted' => $password))) {
// authenticated
$array = array();
$array['verified'] = 'true';
$array['type'] = Auth::user()->UserType;
return Response::json($array);
} else {
// not authenticated
$array = array();
$array['verified'] = 'false';
$array['type'] = $type;
return Response::json($array);
}
} else {
// password is not encrypted
// check if plain text password is correct
if($isInDb->Password == $password) {
// plain text password is correct
$hashed = Hash::make($password);
$arr = array('passwdEncrypted' => $hashed);
$updated = User::where('rsmsOnlineUserID', $isInDb->rsmsOnlineUserID)->update($arr);
if($updated) {
$newUser = User::find($isInDb->rsmsOnlineUserID);
echo $newUser->passwdEncrypted;
if(Auth::attempt(array('ReferenceCode' => $username, 'passwdEncrypted' => $password))) {
echo 'logged in';
} else {
dd(DB::getQueryLog());
echo 'could not log in';
}
} else {
echo 'did not update';
}
} else {
// plain text password is incorrect
$array = array();
$array['verified'] = 'false';
$array['type'] = $type;
return Response::json($array);
}
}
} else {
// not in database
return Respone::json(array('success' => 'false'));
}
發生了什么:我無法登錄,數據庫中的用戶名和密碼為1234
,即使我對此進行了硬編碼,也無法正常工作。
它首先檢查用戶是否在數據庫中,如果存在,則檢查是否存在加密密碼,如果沒有,則將根據給定的密碼創建一個與密碼中的純文本密碼匹配的密碼。然后將用戶登錄(我別無選擇,只能將純文本密碼存儲在數據庫中,這就是他們想要的方式)。
但是它從not authenticated
的代碼部分返回{"verified":"false","type":"prospective_employee"}
。 因此, Auth::attempt()
塊都不起作用。
我是手動登錄的,但是即使Auth::login()
也不起作用。
我的User
模型中有以下內容(包含主數據庫表):
public function getAuthPassword()
{
return $this->Password;
}
/**
* Get the token value for the "remember me" session.
*
* @return string
*/
public function getRememberToken() {
return $this->remember_token;
}
public function setRememberToken($value) {
$this->remember_token = $value;
}
public function getRememberTokenName() {
return 'remember_token';
}
/**
* Get the e-mail address where password reminders are sent.
*
* @return string
*/
public function getReminderEmail()
{
return $this->email;
}
請注意,表中有一個名為Password
的字段,但這是純文本密碼,我需要針對passwdEncrypted
字段進行身份驗證。
出於充分的原因,您不能使用Laravel進行此操作,但這是可笑的不安全且危險的。
我別無選擇,只能將純文本密碼存儲在數據庫中,這就是他們想要的方式
我不明白-為什么您要同時存儲“未加密”和“已加密”密碼? 無關緊要。 您應該只存儲加密的密碼。 不需要任何其他方式,您需要教育人們為什么。
該代碼可在我的另一個站點上運行,我將其更改為數據庫中的passwdEncrypted而不是數據庫中的密碼。 我不能更改它,因為該數據庫也被另一個應用程序使用。
Laravel Auth代碼經過硬編碼以使用“密碼”列。 您不能簡單地將其更改為另一個列。 這就是您的代碼失敗的原因。
由於您沒有使用密碼列,也沒有使用加密的密碼,因此您最好只創建自己的不安全的登錄系統,並根據需要進行定制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.