Laravel——驗證碼認證學習記錄

gongmeng發表於2019-12-20

注:此處所用的註冊等系列功能,均作用於laravel自帶的使用者認證機制

  1. composer安裝驗證碼
        composer require  "mews/captcha:~3.0"

    2.執行以下命令生成配置檔案 config/captcha.php

        php artisan vendor:publish --provider='Mews.aptcha.aptchaServiceProvider'  

    3.前端展示驗證碼

        <img class="thumbnail captcha mt-3 mb-2" src="{{ captcha_src('flat') }}" onclick="this.src='/captcha/flat?'+Math.random()" title="點選圖片重新獲取驗證碼">

    4.後端驗證(該擴充套件包是為Laravel定製的擴充套件包,完全相容laravel註冊功能,驗證非常方便)只需要在app/Http/Controllers/Auth/RegisterController.php中的驗證規則中加入如下程式碼:

        'captcha'  =>  ['required',  'captcha'],
  1. laravel自帶郵箱認證
    laravel自帶的郵箱認證檔案位於 vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php ,因為此檔案採用trait宣告,因此我們快速的將內容通過use整合到使用者的模型中,並進行呼叫,如下:
        namespace App\Models;
        use Illuminate\Foundation\Auth\User as Authenticatable;
        use Illuminate\Notifications\Notifiable;
        use Illuminate\Auth\MustVerifyEmail as MustVerifyEmailTrait;
        class User extends Authenticatable {
           use Notifiable, MustVerifyEmailTrait;

    為了程式碼的規範,我們可以接入larave自帶的郵箱驗證介面 Illuminate\Contracts\Auth\MustVerifyEmail,規定模型必須擁有相關的方法,具體方法如下(方法在MustVerifyEmailTrait中已經定義好,直接呼叫既可):

    • hasVerifiedEmail() 檢測使用者 Email 是否已認證;
    • markEmailAsVerified() 將使用者標示為已認證;
    • sendEmailVerificationNotification() 傳送 Email 認證的訊息通知,觸發郵件的傳送;
    • getEmailForVerification() 獲取傳送郵件地址,提供這個介面允許你自定義郵箱欄位。
  2. 傳送郵件
    我們使用了 Laravel 自帶的 RegisterController ,控制器通過載入 Illuminate.oundation.uth.egistersUsers trait 來引入框架的註冊功能,此時我們開啟此 trait 來翻閱原始碼並定位到 register(Request $request) 方法:

    public  function  register(Request $request)  {  
    // 檢驗使用者提交的資料是否有誤  
    $this->validator($request->all())->validate();  
    // 建立使用者同時觸發使用者註冊成功的事件,並將使用者傳參  
    event(new  Registered($user  =  $this->create($request->all())));  
    // 登入使用者  
    $this->guard()->login($user);  
    // 呼叫鉤子方法`registered()`
    return  $this->registered($request,  $user)  ?:  redirect($this->redirectPath()); 
    }

    此方法處理了使用者提交表單後的邏輯,我們把重點放在 event(new Registered($user = $this->create($request->all())));,這裡使用了 Laravel 的事件系統,觸發了 Registered 事件。

    開啟 app/Providers/EventServiceProvider.php 檔案,此檔案的 $listen 屬性裡我們可以看到註冊了 Registered 事件的監聽器:

    protected  $listen  =  [ 
        Registered::class  =>  [  SendEmailVerificationNotification::class,  ],  
    ];

    開啟 SendEmailVerificationNotification 類,閱讀其原始碼:vendor/laravel/framework/src/Illuminate/Auth/Listeners/SendEmailVerificationNotification.php

<?php  
namespace Illuminate\Auth\Listeners;

use Illuminate\Auth\Events\Registered;
use Illuminate\Contracts\Auth\MustVerifyEmail;

class SendEmailVerificationNotification
{
    /**
     * 處理事件
     *
     * @param  \Illuminate\Auth\Events\Registered  $event
     * @return void
     */
    public function handle(Registered $event)
    {
        // 如果 user 是繼承於 MustVerifyEmail 並且還未啟用的話
        if ($event->user instanceof MustVerifyEmail && ! $event->user->hasVerifiedEmail()) {
            // 傳送郵件認證訊息通知(認證郵件)
            $event->user->sendEmailVerificationNotification();
        }
    }
}

可以看出 Laravel 預設已經為我們設定了郵件傳送的邏輯,接下來我們來測試一下。

3.測試郵件

測試之前,我們先設定下郵件傳送到 log 中,以便後面的測試:
修改環境設定檔案.env

MAIL_DRIVER=log

郵件一般發在storage/logs目錄下的日誌檔案中

相關文章