Laravel 5.1使用者認證

chorylee就是我發表於2018-05-23

忘記密碼是應用中常見的場景之一,Laravel 5.1也提供了對密碼重置的支援,我們只需稍微做一下配置即可輕鬆實現重置密碼。

1、實現思路

通過給使用者註冊郵箱傳送包含特定令牌的重置密碼連結,然後使用者登入郵箱通過訪問該重置密碼連結實現密碼的重置。

2、資料表&模型

  • 實現CanResetPasswordContract契約並使用CanResetPasswordtrait的User模型(Laravel自帶)
  • 用於存放重置密碼令牌的表password_resets(Laravel自帶該表對應遷移檔案,上一節中已一併建立)

3、建立路由

Laravel自帶了用於密碼重置的控制器Auth\PasswordController,和上一節提到的AuthController位於統一目錄下。重置密碼相關的業務邏輯都是通過該控制器中使用的ResetsPasswordstrait來實現的。下面我們在routes.php中為重置密碼定義相關路由規則:

// 傳送密碼重置連結路由
Route::get('password/email', 'Auth\PasswordController@getEmail');
Route::post('password/email', 'Auth\PasswordController@postEmail');

// 密碼重置路由
Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');
Route::post('password/reset', 'Auth\PasswordController@postReset');複製程式碼

4、建立檢視

定義好路由之後我們為get請求定義對應檢視檔案,首先建立傳送密碼重置連結路由對應檢視resources/views/auth/password.blade.php

<form method="POST" action="/password/email">
    {!! csrf_field() !!}

    <div>
        Email
        <input type="email" name="email" value="{{ old('email') }}">
    </div>

    <div>
        <button type="submit">
            傳送密碼重置連結
        </button>
    </div>
</form>
複製程式碼

然後建立重置密碼路由對應檢視resources/views/auth/reset.blade.php

<form method="POST" action="/password/reset">
    {!! csrf_field() !!}
    <input type="hidden" name="token" value="{{ $token }}">

    <div>
        Email:<input type="email" name="email" value="{{ old('email') }}">
    </div>

    <div>
        新密碼:<input type="password" name="password">
    </div>

    <div>
        確認密碼:<input type="password" name="password_confirmation">
    </div>

    <div>
        <button type="submit">
            重置密碼
        </button>
    </div>
</form>
複製程式碼

此外我們還要建立一個額外檢視——傳送密碼重置連結的郵件模板檢視resources/views/emails/password.blade.php,用於為該郵件提供檢視模板:

點選這裡重置密碼: {{ url('password/reset/'.$token) }}
複製程式碼

如果該郵件模板檢視檔案路徑位於其他地方,不要忘了配置config/auth.php中的password.email值與新路徑對應。

5、傳送郵件配置

接下來我們要做的是配置相關檔案實現郵件傳送功能為下一步測試做準備。

Laravel使用SwiftMailer庫提供的郵件API實現郵件操作,詳情可檢視郵件文件,這裡我們僅作簡單配置實現郵件傳送,郵件配置檔案是config/mail.php

<?php

return [
    'driver' => env('MAIL_DRIVER', 'smtp'),
    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
    'port' => env('MAIL_PORT', 587),
    'from' => ['address' => null, 'name' => null],
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
    'username' => env('MAIL_USERNAME'),
    'password' => env('MAIL_PASSWORD'),
    'sendmail' => '/usr/sbin/sendmail -bs',
    'pretend' => false,
];
複製程式碼

可見大部分配置在.env檔案中設定,這裡我的.env檔案配置如下:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=25
MAIL_USERNAME=yaojinbu@163.com
MAIL_PASSWORD=mypassword
MAIL_ENCRYPTION=null
複製程式碼

我使用的是163郵箱,其它郵箱參考對應郵箱相關設定項,並將自己的賬戶資訊填寫到MAIL_USERNAMEMAIL_PASSWORD

此外我們還要配置mail.php中的from配置如下:

'from' => ['address' => 'yaojinbu@163.com ', 'name' => 'Laravel學院'],
複製程式碼

這裡只需要將address.env檔案中的MAIL_USERNAME值相匹配即可。至於name值就是郵箱中發件人名稱,可自定義。

做好這一步配置後,接下來即可測試密碼重置了。


相關文章