通過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
基類,否則會報錯。然後我們在這個模型中使用了Notifiable
Trait,裡面提供了使用者傳送通知的相關方法。我們在白名單$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 應用中實現登入認證功能了。這樣,我們點選首頁的右上角的登入按鈕,就可以進入登入頁面了: