簡體   English   中英

Laravel 4 Auth :: attempt在正確值上返回false

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM