1. 程式人生 > 實用技巧 >通過Laravel內建腳手架快速實現使用者認證

通過Laravel內建腳手架快速實現使用者認證

系統自帶腳手架

資料庫遷移

新安裝的laravel應用中都會包含下面兩個遷移檔案,分別用於建立使用者表和密碼重置表,這兩張表在使用者認證和找回密碼中會用到:

User模型

laravel框架還在app目錄下為我們提供了與使用者表相對相應的User模型,在基於Eloquent模型驅動的認證提供者中,我們通過該模型實現登入認證,可以在配置檔案config/auth.php中檢視相應的配置:

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

如果不是通過User模型類進行認證,可以在這裡修改對應的model配置項。如果不想通過Eloquent模型驅動,而是基於原聲生資料庫查詢,可以註釋掉eloquent對應的users配置,啟用下面這個database對應的users配置,這樣的話就直接去查詢users表,而不是通過模型類進行認證了。

User模型類程式碼:

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

如果某個類需要用於認證,必須繼承自use Illuminate\Foundation\Auth\User 基類,否則會報錯。然後我們在這個模型中使用了NotifiableTrait,裡面提供了使用者傳送通知的相關方法。我們在白名單$fillable中配置了三個欄位,這三個欄位會在登入和註冊時用到,最後我們還配置了$hidden屬性,再返回查詢結果的時候將敏感資訊過濾掉,避免安全隱患。

認證中介軟體

laravel框架內建了幾個認證中介軟體,用於在需要認證的路由中拒絕未認證使用者發起的請求,或者將未登入的使用者重定向到認證頁面。開啟app/Http/Kernel.php,可以在$routeMiddleware

看到對應的路由中介軟體。

我們平時主要用到的是auth中介軟體和guest中介軟體,auth.basic使用者基於HTTP的簡單認證,很少用到,throttle中漸漸會在使用者多次登入失敗時使用,規定時間內登入失敗超過指定次數不允許繼續發起登入請求。提高系統安全性。

auth中介軟體是\App\Http\Middleware\Authenticate::class的別名,Authenticate主要用於將未登入的使用者重定向到登入頁面:

class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string
     */
    protected function redirectTo($request)
    {
        return route('login');
    }
}

guest 中介軟體是 \App\Http\Middleware\RedirectIfAuthenticated::class 的別名,RedirectIfAuthenticated 主要用於將已登入使用者重定向到認證後頁面,未登入則繼續原來的請求:

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/home');
        }

        return $next($request);
    }
}

認證控制器

laravel還為我們提供了註冊、登入、重置密碼、郵箱驗證、忘記密碼對應的控制器:

其中 ForgotPasswordController 用於忘記密碼後通過填寫註冊郵箱傳送重置密碼連結,對應邏輯位於 Illuminate\Foundation\Auth\SendsPasswordResetEmails Trait 中。

LoginController 用於使用者登入和退出,對應邏輯位於 Illuminate\Foundation\Auth\AuthenticatesUsers Trait 中。

RegisterController 用於新使用者註冊,對應邏輯位於 Illuminate\Foundation\Auth\RegistersUsers Trait 中。

ResetPasswordController 用於重置密碼,對應邏輯位於 Illuminate\Foundation\Auth\ResetsPasswords Trait 中。

上述控制器的建構函式中都應用了 guest 中介軟體(退出功能除外),表示這些控制器提供的方法都是給未登入使用者使用的。

通過Artisan命令快速實現註冊登入

php artisan make:auth # 註冊認證路由、釋出認證檢視
php artisan migrate   # 建立認證相關資料表,如果之前已經執行過,可以跳過
npm run dev           # 編譯前端資源,如果之前已經執行過,可以跳過

make:auth 命令會在 routes/web.php 中註冊以下路由:

Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');

home 路由是使用者認證成功後預設跳轉路由,Auth::routes() 則包含以下路由定義:

// Authentication Routes...
$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
$this->post('login', 'Auth\LoginController@login');
$this->post('logout', 'Auth\LoginController@logout')->name('logout');

$this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
$this->post('register', 'Auth\RegisterController@register');

// Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
$this->post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update');

// Email Verification Routes...
$this->get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
$this->get('email/verify/{id}', 'Auth\VerificationController@verify')->name('verification.verify');
$this->get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');

此外,該命令還會在 resources/views 下發布以下登入認證相關的檢視檔案:

  • resources/views/home.blade.php
  • resources/views/layouts/app.blade.php
  • resources/views/auth/login.blade.php
  • resources/views/auth/register.blade.php
  • resources/views/auth/verify.blade.php
  • resources/views/auth/passwords/email.blade.php
  • resources/views/auth/passwords/reset.blade.php

這樣,不需要編寫任何程式碼,只需要簡單執行幾個命令,就可以在 Laravel 應用中實現登入認證功能了。這樣,我們點選首頁的右上角的登入按鈕,就可以進入登入頁面了: