# Laravel 的密碼重設功能
- [簡介](#introduction)
- [數據庫注意事項](#resetting-database)
- [路由](#resetting-routing)
- [視圖](#resetting-views)
- [重置密碼后](#after-resetting-passwords)
- [密碼自定義](#password-customization)
<a name="introduction"></a>
## 簡介
> {tip} **想要快速上手此功能?** 首先在新的 Laravel 應用中運行 `php artisan make:auth` 命令, 然后在瀏覽器中打開 `http://your-app.dev/register`,或者任意一個在應用中分配的 URL。這個命令將會生成包括密碼重置在內的整個認證系統。
大部分 web 應用為用戶提供了重置密碼的功能。Laravel 提供了方便的方法發送密碼重置鏈接并完成密碼重置,而不需要在每個應用中重新實現。
> {note} 在使用 Laravel 的密碼重置功能之前,你必須在你的用戶模型中使用 `Illuminate\Notifications\Notifiable` 這個 trait,也就是加入 `use Illuminate\Notifications\Notifiable` 這行代碼,框架中自帶的用戶模型 App\User 中已添加。
<a name="resetting-database"></a>
## 數據庫注意事項
開始之前,請確認你的 `App\User` 模型實現了 `Illuminate\Contracts\Auth\CanResetPassword` 這個契約。當然,Laravel 框架中包含的 `App\User` 模型已經實現了這個接口,并且需要使用 `Illuminate\Auth\Passwords\CanResetPassword` 這個 trait 引入實現這個接口的方法。
#### 生成重置令牌的數據表
接下來,我們需要創建保存密碼重置令牌的數據表。因為 Laravel 已經自帶了用于生成這張表的遷移,就存放在 `database/migrations` 目錄下, 因此你只需要運行下面的命令就能完成相應數據表的創建:
php artisan migrate
<a name="resetting-routing"></a>
## 路由
Laravel 在?`Auth\ForgotPasswordController` 和?`Auth\ResetPasswordController` 這兩個類中分別實現了通過郵件發送重置密碼鏈接和重置密碼的邏輯。所有重置密碼需要用到的路由都會通過執行 `make:auth` 這個 Artisan 命令生成:
php artisan make:auth
<a name="resetting-views"></a>
## 視圖
另外,當 Laravel 執行 `make:auth` 命令時,會在 `resources/views/auth/passwords` 目錄下生成充值密碼所需要的視圖文件。當然你可以根據項目需求隨意修改這些視圖文件。
<a name="after-resetting-passwords"></a>
## 重置密碼后
一旦你生成了用于重置用戶密碼的路由和視圖,你就可以在瀏覽器中訪問 `/password/reset` 這個路由來重置密碼。框架中的 `ForgotPasswordController` 已經實現了通過郵件發送重置密碼鏈接的邏輯,`ResetPasswordController` 實現了重置密碼的邏輯。
重置密碼后,用戶就會自動登錄并重定向到 `/home`。你可以修改 `ResetPasswordController` 中的 `redirectTo` 屬性,從而自定義重置密碼后重定向到的位置:
protected $redirectTo = '/dashboard';
> {note} 默認情況下,重置密碼的令牌一小時后會失效。你可以修改 `config/auth.php` 文件中的 `expire` 選項來修改這個過期時間。
<a name="password-customization"></a>
## 自定義
#### 自定義認證 Guard
在 `auth.php` 配置文件中,你可以配置多個「guards」參數,用于實現多個用戶表的不同認證方式。你可以在 `ResetPasswordController` 中重寫 `guard` 方法來選擇指定的 guard 來完成認證。這個方法需要返回一個 guard 實例:
use Illuminate\Support\Facades\Auth;
protected function guard()
{
return Auth::guard('guard-name');
}
#### 自定義密碼 Broker
在 `auth.php` 配置文件中,你可以配置多個密碼 「brokers」,用于多個表的密碼重置。你可以通過重寫 `ForgotPasswordController` 和?`ResetPasswordController` 中的 `broker` 方法來選擇你想使用的自定義 broker:
use Illuminate\Support\Facades\Password;
/**
* Get the broker to be used during password reset.
*
* @return PasswordBroker
*/
protected function broker()
{
return Password::broker('name');
}
#### 自定義用于重置的郵箱(或者其他通知方式)
你可以方便的修改用于發送密碼重置鏈接的通知類。首先,重寫 `User` 模型中的 `sendPasswordResetNotification` 方法。在這個方法中,你可以選擇任意的通知類來發送通知。這個方法的第一個參數為用于重置密碼的令牌 `$token` :
/**
* Send the password reset notification.
*
* @param string $token
* @return void
*/
public function sendPasswordResetNotification($token)
{
$this->notify(new ResetPasswordNotification($token));
}
## 譯者署名
| 用戶名 | 頭像 | 職能 | 簽名 |
|---|---|---|---|
| [@lockdown56](https://laravel-china.org/users/7083) | <img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/7083_1503468748.jpg?imageView2/1/w/100/h/100"> | 翻譯 | 農閑出來敲代碼,農忙回家種玉米 |
---
> {note} 歡迎任何形式的轉載,但請務必注明出處,尊重他人勞動共創開源社區。
>
> 轉載請注明:本文檔由 Laravel China 社區 [laravel-china.org](https://laravel-china.org) 組織翻譯,詳見 [翻譯召集帖](https://laravel-china.org/topics/5756/laravel-55-document-translation-call-come-and-join-the-translation)。
>
> 文檔永久地址: https://d.laravel-china.org
- 說明
- 翻譯說明
- 發行說明
- 升級說明
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- HomeStead
- Valet
- 核心架構
- 請求周期
- 服務容器
- 服務提供者
- 門面(Facades)
- Contracts
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- 重定向
- Session
- 表單驗證
- 錯誤與日志
- 前端開發
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- 用戶認證
- API認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- API 資源
- 序列化
- 測試
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Passport OAuth 認證
- Scout 全文搜索
- Socialite 社交化登錄
- 交流說明