想要快速實現該功能?只需要在新安裝的 Laravel 應用下運行 php artisan make:auth (如果你已經執行過此命令,可忽略),然後在瀏覽器中訪問 http://your-app.dev/register 或者其他分配給應用的 URL,該命令會產生使用者登入註冊所需要的所有東西,包括密碼重設!
大多數 Web 應用程式都提供了為使用者重設密碼的功能,Laravel 也不例外,Laravel 提供了用於發送密碼重設連結及實現密碼重設邏輯的便捷方法,而不需要你在每個應用中自己重複實現。
註:在使用 Laravel 提供的密碼重設功能之前, User 模型必須使用了 Illuminate\Notifications\Notifiable trait。
資料庫相關
開始之前,先驗證 App\User 模型實現了 Illuminate\Contracts\Auth\CanResetPassword 契約。當然,Laravel 內建的 App\User 模型已經實現了該介面,並使用 Illuminate\Auth\Passwords\CanResetPassword trait 來包含實現該介面需要的方法。
產生重設令牌表遷移
接下來,用來儲存密碼重設令牌的表必須被建立,Laravel 已經內建了這張表的遷移,就存放在 database/migrations 目錄。所以,你所要做的僅僅是運行遷移:
php artisan migrate
這張表就是 password_resets :
路由
Laravel 內建了 Auth\ForgotPasswordController 和 Auth\ResetPasswordController 控制器(這兩個控制器類會通過 php artisan make:auth 命令自動產生),分別用於發送密碼重設連結郵件和重設使用者密碼功能。重設密碼所需的路由都已經通過 make:auth 命令自動產生了:
php artisan make:auth
對應路由定義在 Illuminate\Routing\Router 的 auth 方法中:
視圖
和路由一樣,重設密碼所需的視圖檔案也通過 make:auth 命令一併產生了,這些視圖檔案位於
resources/views/auth/passwords 目錄下,你可以按照所需對產生的檔案進行相應修改。
重設密碼
定義好重設使用者密碼路由和視圖後,只需要在瀏覽器中通過 /password/reset 訪問這個入口路由。架構內建的 ForgotPasswordController 已經包含了發送密碼重設連結郵件的邏輯, ResetPasswordController 包含了重設使用者密碼的邏輯:
輸入註冊郵箱,點擊發送密碼重設連結,就會發送密碼重設連結到該郵箱:
開啟郵箱會收到這樣一封重設密碼郵件:
點擊重設密碼按鈕,即可進入重設密碼頁面:
填寫表單提交之後即可重設密碼。
密碼被重設後,使用者將會自動登入到應用並重新導向到 /home 。你可以通過定義 ResetPasswordController 的 redirectTo 屬性來自訂密碼重設成功後的跳轉連結:
protected $redirectTo = '/dashboard';
註:預設情況下,密碼重設令牌一小時內有效,你可以通過修改 config/auth.php 檔案中的選項 expire 來改變有效時間。
自訂
自訂認證 Guard
在設定檔 auth.php 中,可以配置多個“guards”,以便用於實現基於多使用者表的獨立認證,你可以通過重寫內建的 ResetPasswordController 控制器上的 guard 方法來使用你所選擇的 guard,該方法將會返回一個 guard 執行個體:
use Illuminate\Support\Facades\Auth;protected function guard(){ return Auth::guard('guard-name');}
自訂密碼 broker
在設定檔 auth.php 中,可以配置多個密碼,以便用於重設多個使用者表的密碼 broker,同樣,可以通過重寫內建的 ForgotPasswordController 和 ResetPasswordController 控制器中的 broker 方法來使用你所選擇的 broker:
use Illuminate\Support\Facades\Password;
/** * 擷取密碼重設期間所使用的broker. * * @return PasswordBroker * @translator laravelacademy.org */protected function broker(){ return Password::broker('name');}
自訂密碼重設郵件
你可以很方便地編輯發送密碼重設連結給使用者的通知類實現自訂密碼重設郵件,要實現這一功能,需要重寫 User 模型上的 sendPasswordResetNotification 方法,在這個方法中,可以使用任何你所喜歡的通知類發送通知,該方法接收的第一個參數是密碼重設 $token :
/** * 發送密碼重設通知. * * @param string $token * @return void */public function sendPasswordResetNotification($token){ $this->notify(new ResetPasswordNotification($token));}