簡體   English   中英

Laravel - 更新密碼后無法登錄

[英]Laravel - can´t login after update password

我有以下問題。 我用播種機創建了一個用戶和密碼。 用戶創建良好,密碼存儲在加密的數據庫中。 而且我可以登錄。 當我嘗試更改此密碼時,我注意到數據庫中的密碼字符串發生了變化(其他內容已加密),但我無法使用新密碼或舊密碼登錄。

我在模型中有這個:

public function setPasswordAttribute($password)
{
    $this->attributes['password'] = Hash::make($password);
}

並在控制器中設置新密碼我有這個

$user = AuthAction::$user;
$user->password = $subscriberData['password'];
$user->save();

最后一點,我為用戶使用的模型稱為訂閱者,當我執行 $user 變量的 var_dump 時,我可以看到它是模型訂閱者的一個實例。

這是因為您更新的密碼被散列兩次。 一個通過你雄辯的突變器

另一個通過ResetPasswordController

protected function resetPassword($user, $password)
{
    $user->forceFill([
        'password' => bcrypt($password),//problem is here, $password was already hashed by eloquent mutator
        'remember_token' => str_random(60),
    ])->save();

    $this->guard()->login($user);
}

您可以通過像這樣覆蓋ResetPasswordController 中resetPassword函數來解決這個問題:

protected function resetPassword($user, $password)
{
    $user->forceFill([
        'password' => $password,
        'remember_token' => str_random(60),
    ])->save();

    $this->guard()->login($user);
}

在 Laravel 中使用 Bcrypt 散列密碼:

$password = Hash::make('yourpassword');

這將創建一個散列密碼。 您可以在您的控制器甚至模型中使用它,例如,如果用戶使用表單使用 POST 方法將密碼提交給您的控制器,那么您可以使用如下方式散列它:

$password = Input::get('passwordformfield'); // password is form field
$hashed = Hash::make($password);

在這里, $hashed將包含散列的密碼。 基本上,您將在創建/注冊新用戶時執行此操作,因此,例如,如果用戶使用表單提交姓名、電子郵件、用戶名和密碼等詳細信息,則在將數據插入數據庫之前,您'將在驗證數據后散列密碼。 有關更多信息,請閱讀文檔。

更新:

$password = 'JohnDoe';
$hashedPassword = Hash::make($password);
echo $hashedPassword; // $2y$10$jSAr/RwmjhwioDlJErOk9OQEO7huLz9O6Iuf/udyGbHPiTNuB3Iuy

因此,您將$hashedPassword插入到數據庫中。 希望,現在已經很清楚了,如果你仍然感到困惑,那么我建議你閱讀一些教程,在 laracasts.com 和 tutsplus.com 上觀看一些屏幕投射,並閱讀一本關於 Laravel 的書,這是一本免費的電子書,你可以下載.

更新:由於 OP 想要使用 Laravel Hash 手動加密密碼而無需任何類或表單,因此這是從命令提示符使用 artisan tinker 的另一種方法

轉到您的命令提示符/終端導航到 Laravel 安裝(您項目的根目錄)使用 cd 並從命令提示符/終端按 Enter 然后編寫 php artisan tinker 並按 Enter 然后編寫 echo Hash::make('somestring'); 你會在控制台上得到一個散列密碼,復制它然后做任何你想做的事情。 更新(Laravel 5.x):

// Also one can use bcrypt
$password = bcrypt('JohnDoe');
$user = AuthAction::$user;
$user->password = Hash::make($subscriberData['password']);
$user->save();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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