重設密碼
{tip}
簡介
想要快速上手?
只需要在新建的Laravel 應用程式中執行php artisan make:auth,然後在瀏覽器中開啟
http://your-app.test/register
# 或給你的應用分配任一個URL。這個命令將會負責搭建整個身分驗證系統,包括重設密碼!
大多數 web 應用程式都為使用者提供了重設密碼的功能。相較於強迫你在每個應用中都要重新實現一遍此功能,Laravel 提供了便捷的方法來發送密碼提醒以及執行密碼重置。
{note} 在使用 Laravel 的密碼重設功能之前,你的使用者模型必須使用資料庫注意事項
首先,驗證你的 App\User
模型是否實作了 Illuminate\Contracts\Auth\CanResetPassword
契約。當然,框架中包含的 App\User
模型已經實現了該接口,並且使用了 Illuminate\Auth\Passwords\CanResetPassword
trait t 來包含實現該接口所需的方法。
產生重設令牌的資料表遷移
接下來,必須建立一張資料表來儲存密碼重設令牌。此資料表的遷移已包含在 Laravel 應用的 database/migrations
目錄中。所以,你需要做的只是執行資料庫遷移指令:
php artisan migrate
#路由
Laravel 已在 Auth\ForgotPasswordController
和Auth\ResetPasswordController
類別中包含了發送密碼重設連結電子郵件和重設使用者密碼的邏輯。所有執行密碼重設所需的路由可以使用Artisan 指令make:auth
來產生:
php artisan make:auth
視圖
當執行make:auth
指令時,Laravel 會產生重設密碼所需的所有視圖。這些檢視位於 resources/views/auth/passwords
目錄中。你可以根據你應用的需要隨意修改這些視圖。
重設密碼後
#一旦你定義了重置使用者密碼的路由和視圖,你可以在瀏覽器中存取/password/reset
這個路由來重置密碼。框架中的 ForgotPasswordController
已包含傳送密碼重設連結電子郵件的邏輯,同時 ResetPasswordController
包含了重設使用者密碼的邏輯。
在重設密碼後,使用者將會自動登入並重新導向至 /home
。你可以透過在ResetPasswordController
中定義一個redirectTo
屬性來自訂密碼重設後重定向的位置:
protected $redirectTo = '/dashboard';
{note} 預設情況下,密碼重置令牌會在一小時後過期。你可以透過
config/auth.php
檔案中的密碼重設expire
選項對此進行修改。
自訂
#自訂身份驗證守護器
在你的auth.php
設定檔中,你可以設定多個「看守器」,可以用來定義多個使用者表的身份驗證行為。你可以自訂框架中的 ResetPasswordController
,透過重寫該控制器中的 guard
方法來使用你所選擇的看守器。這個方法應當傳回一個看守器實例:
use Illuminate\Support\Facades\Auth;protected function guard(){ return Auth::guard('guard-name'); }
自訂密碼代理
在你的auth.php
設定檔中,你可以設定多個密碼「代理」,可以用來重設多個使用者表上的密碼。你可以自訂框架中的ForgotPasswordController
和ResetPasswordController
, 透過重寫控制器中的 broker
方法來使用你所選擇的代理:
use Illuminate\Support\Facades\Password; /** * 获取在密码重置期间使用的代理。 * * @return PasswordBroker */ protected function broker(){ return Password::broker('name'); }
自訂密碼重設郵件
你可以輕鬆修改用於傳送密碼重設連結給使用者的通知類別。首先,重寫 User
模型中的 sendPasswordResetNotification
方法。在這個方法中,你可以使用任何你所選擇的通知類別來發送通知。此方法接收的第一個參數是密碼重設令牌 $token
:
/** * 发送密码重置通知。 * * @param string $token * @return void */ public function sendPasswordResetNotification($token){ $this->notify(new ResetPasswordNotification($token)); }