<article><h1>Laravel 的密碼重設功能</h1><ul><li><a href="#introduction">簡介</a></li><li><a href="#resetting-database">數據庫注意事項</a></li><li><a href="#resetting-routing">路由</a></li><li><a href="#resetting-views">視圖</a></li><li><a href="#after-resetting-passwords">重置密碼后</a></li><li><a href="#password-customization">密碼自定義</a></li></ul><p><a name="introduction"></a></p><h2><a href="#introduction">簡介</a></h2><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> <strong>想要快速上手此功能?</strong> 首先在 Laravel 應用下運行 <code class=" language-php">php artisan make<span class="token punctuation">:</span>auth</code> 命令,然后使用瀏覽器打開 <code class=" language-php">http<span class="token punctuation">:</span><span class="token operator">/</span><span class="token operator">/</span>your<span class="token operator">-</span>app<span class="token punctuation">.</span>dev<span class="token operator">/</span>register</code> ,或者任意一個在應用中分配的 URL 。這個命令將會生成包括密碼重置在內的整個認證系統。</p></blockquote><p>大部分的 web 應用都為用戶提供重置密碼的功能。Laravel 提供了一種非常方便的方法用于發送密碼重置郵件來完成密碼重置,而不需要在每個應用中重新實現。</p><blockquote class="has-icon note"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="90px" height="90px" viewBox="0 0 90 90" enable-background="new 0 0 90 90" xml:space="preserve"><path fill="#FFFFFF" d="M45 0C20.1 0 0 20.1 0 45s20.1 45 45 45 45-20.1 45-45S69.9 0 45 0zM45 74.5c-3.6 0-6.5-2.9-6.5-6.5s2.9-6.5 6.5-6.5 6.5 2.9 6.5 6.5S48.6 74.5 45 74.5zM52.1 23.9l-2.5 29.6c0 2.5-2.1 4.6-4.6 4.6 -2.5 0-4.6-2.1-4.6-4.6l-2.5-29.6c-0.1-0.4-0.1-0.7-0.1-1.1 0-4 3.2-7.2 7.2-7.2 4 0 7.2 3.2 7.2 7.2C52.2 23.1 52.2 23.5 52.1 23.9z"></path></svg></span></div> 在使用 Laravel 密碼重置功能之前, 你必須 <code class=" language-php"><span class="token keyword">use</span></code> 這個 <code class=" language-php">Illuminate\<span class="token package">Notifications<span class="token punctuation">\</span>Notifiable</span></code> <code class=" language-php"><span class="token keyword">trait</span></code>。</p></blockquote><p><a name="resetting-database"></a></p><h2><a href="#resetting-database">數據庫注意事項</a></h2><p>開始之前,請先確認你的 <code class=" language-php">App\<span class="token package">User</span></code> 模型是否實現了 <code class=" language-php">Illuminate\<span class="token package">Contracts<span class="token punctuation">\</span>Auth<span class="token punctuation">\</span>CanResetPassword</span></code> 協議。當然,在 Laravel 框架中 <code class=" language-php">App\<span class="token package">User</span></code> 模型已經實現了這個接口,并使用 <code class=" language-php">Illuminate\<span class="token package">Auth<span class="token punctuation">\</span>Passwords<span class="token punctuation">\</span>CanResetPassword</span></code> <code class=" language-php"><span class="token keyword">trait</span></code> 來實現該接口包含的方法。</p><h4>生成重置令牌表遷移</h4><p>接下來,我們必須先創建用來存儲密碼重置令牌的數據表。由于 Laravel 已經自帶了這張表的遷移,就存放在 <code class=" language-php">database<span class="token operator">/</span>migrations</code> 目錄,因此,你僅僅只需要運行下面的命令即可完成數據表的創建:</p><pre class=" language-php"><code class=" language-php">php artisan migrate</code></pre><p><a name="resetting-routing"></a></p><h2><a href="#resetting-routing">路由</a></h2><p>Laravel 在 <code class=" language-php">Auth\<span class="token package">ForgotPasswordController</span></code> 和 <code class=" language-php">Auth\<span class="token package">ResetPasswordController</span></code> 兩個類中包含了電子郵件密碼重置鏈接和重置用戶密碼的必要邏輯。你只需要使用 Artisan 命令 <code class=" language-php">make<span class="token punctuation">:</span>auth</code> 命令即可生成密碼重置所需要的路由:</p><pre class=" language-php"><code class=" language-php">php artisan make<span class="token punctuation">:</span>auth</code></pre><p><a name="resetting-views"></a></p><h2><a href="#resetting-views">視圖</a></h2><p>和路由一樣Laravel 在執行 <code class=" language-php">make<span class="token punctuation">:</span>auth</code> 命令時同時會在 <code class=" language-php">resources<span class="token operator">/</span>views<span class="token operator">/</span>auth<span class="token operator">/</span>passwords</code> 生成密碼重置必要視圖文件。當然,你可以隨意對它們進行修改。</p><p><a name="after-resetting-passwords"></a></p><h2><a href="#after-resetting-passwords">重置密碼后</a></h2><p>一旦您定義了重置用戶密碼的路由和視圖后,您可以在瀏覽器中訪問 <code class=" language-php"><span class="token operator">/</span>password<span class="token operator">/</span>reset</code> 。 框架自帶的 <code class=" language-php">ForgotPasswordController</code> 已經包含了發送密碼重置鏈接郵件的邏輯, <code class=" language-php">ResetPasswordController</code> 包含了重置用戶密碼的邏輯。</p><p>在密碼重置之后,用戶將會自動登錄并重定向到 <code class=" language-php"><span class="token operator">/</span>home</code> 。你可以定義 <code class=" language-php">ResetPasswordController</code> 控制器的 <code class=" language-php">redirectTo</code> 屬性來定制密碼重置成功后的自定義跳轉鏈接:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">protected</span> <span class="token variable">$redirectTo</span> <span class="token operator">=</span> <span class="token string">'/dashboard'</span><span class="token punctuation">;</span></code></pre><blockquote class="has-icon note"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="90px" height="90px" viewBox="0 0 90 90" enable-background="new 0 0 90 90" xml:space="preserve"><path fill="#FFFFFF" d="M45 0C20.1 0 0 20.1 0 45s20.1 45 45 45 45-20.1 45-45S69.9 0 45 0zM45 74.5c-3.6 0-6.5-2.9-6.5-6.5s2.9-6.5 6.5-6.5 6.5 2.9 6.5 6.5S48.6 74.5 45 74.5zM52.1 23.9l-2.5 29.6c0 2.5-2.1 4.6-4.6 4.6 -2.5 0-4.6-2.1-4.6-4.6l-2.5-29.6c-0.1-0.4-0.1-0.7-0.1-1.1 0-4 3.2-7.2 7.2-7.2 4 0 7.2 3.2 7.2 7.2C52.2 23.1 52.2 23.5 52.1 23.9z"></path></svg></span></div> 默認情況下, 密碼重置令牌在一小時內有效。你可以通過修改 <code class=" language-php">config<span class="token operator">/</span>auth<span class="token punctuation">.</span>php</code> 的 <code class=" language-php">expire</code> 選項來修改此項配置。</p></blockquote><p><a name="password-customization"></a></p><h2><a href="#password-customization">自定義</a></h2><h4>自定義認證 Guard</h4><p>在配置文件 <code class=" language-php">auth<span class="token punctuation">.</span>php</code> 中, 你可以配置多個 「guards」 參數,可以用來多用戶表的獨立認證。你可以通過重寫 <code class=" language-php">ResetPasswordController</code> 控制器的 <code class=" language-php">guard</code> 方法來實現自定義認證 <code class=" language-php">guard</code> , 同時別忘了,這個方法需要返回一個 <code class=" language-php">guard</code> 實例:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Support<span class="token punctuation">\</span>Facades<span class="token punctuation">\</span>Auth</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function">guard<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token scope">Auth<span class="token punctuation">::</span></span><span class="token function">guard<span class="token punctuation">(</span></span><span class="token string">'guard-name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><h4>自定義密碼 Broker</h4><p>在配置文件 <code class=" language-php">auth<span class="token punctuation">.</span>php</code> 中, 可以配置多個密碼 「brokers」 , 它可以用于多個用戶表重置密碼。你可以通過重寫 <code class=" language-php">ForgotPasswordController</code> 和 <code class=" language-php">ResetPasswordController</code> 控制器的 <code class=" language-php">broker</code> 方法來實現你的自定義 <code class=" language-php">broker</code> :</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Support<span class="token punctuation">\</span>Facades<span class="token punctuation">\</span>Password</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* 獲取在密碼重置期間使用的 broker
*
* @return PasswordBroker
*/</span>
<span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function">broker<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token scope">Password<span class="token punctuation">::</span></span><span class="token function">broker<span class="token punctuation">(</span></span><span class="token string">'name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><h4>自定義重置郵箱</h4><p>你可以方便的修改通知類用以給用戶發送密碼重置鏈接。在開始之前, 重寫 <code class=" language-php">User</code> 模型中 <code class=" language-php">sendPasswordResetNotification</code> 方法。在這個方法中,你可以使用你選擇的任意通知類發送通知。這個方法的第一個參數為密碼重置令牌 <code class=" language-php"><span class="token variable">$token</span></code> :</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 發送密碼重置通知
*
* @param string $token
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">sendPasswordResetNotification<span class="token punctuation">(</span></span><span class="token variable">$token</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">notify<span class="token punctuation">(</span></span><span class="token keyword">new</span> <span class="token class-name">ResetPasswordNotification</span><span class="token punctuation">(</span><span class="token variable">$token</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><h2>譯者署名</h2><table><thead><tr><th>用戶名</th><th>頭像</th><th>職能</th><th>簽名</th></tr></thead><tbody><tr><td><a href="https://github.com/GanymedeNil">@GanymedeNil</a></td><td><img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/6859_1487055454.jpg?imageView2/1/w/100/h/100"></td><td>翻譯</td><td>我不是Full Stack Developer 2333 <a href="http://weibo.com/jinhongyang">@GanymedeNil</a></td></tr></tbody></table></article>
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 請求周期
- 開發環境部署
- Valet
- Homestead
- 核心概念
- 服務提供者
- Facades
- Contracts
- 服務容器
- HTTP 層
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- Session
- 表單驗證
- 前端
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- API 認證
- 用戶認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- Redis
- 數據填充
- Eloquent ORM
- Eloquent ORM快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- 序列化
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 錯誤與日志
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度