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