Laravel核心代码学习--用户认证系统(基础介绍)
用戶認證系統(基礎介紹)
使用過Laravel的開發者都知道,Laravel自帶了一個認證系統來提供基本的用戶注冊、登錄、認證、找回密碼,如果Auth系統里提供的基礎功能不滿足需求還可以很方便的在這些基礎功能上進行擴展。這篇文章我們先來了解一下Laravel Auth系統的核心組件。
Auth系統的核心是由 Laravel 的認證組件的「看守器」和「提供器」組成。看守器定義了該如何認證每個請求中用戶。例如,Laravel 自帶的 session 看守器會使用 session 存儲和 cookies 來維護狀態。
下表列出了Laravel Auth系統的核心部件
| Auth | AuthManager的Facade |
| AuthManager | Auth認證系統面向外部的接口,認證系統通過它向應用提供所有Auth用戶認證相關的方法,而認證方法的具體實現細節由它代理的具體看守器(Guard)來完成。 |
| Guard | 看守器,定義了該如何認證每個請求中用戶 |
| User Provider | 用戶提供器,定義了如何從持久化的存儲數據中檢索用戶 |
在本文中我們會詳細介紹這些核心部件,然后在文章的最后更新每個部件的作用細節到上面給出的這個表中。
開始使用Auth系統
只需在新的 Laravel 應用上運行?php artisan make:auth?和?php artisan migrate?命令就能夠在項目里生成Auth系統需要的路由和視圖以及數據表。
php artisan make:auth執行后會生成Auth認證系統需要的視圖文件,此外還會在路由文件web.php中增加響應的路由:
Auth::routes(); 復制代碼Auth Facade文件中單獨定義了routes這個靜態方法
public static function routes() {static::$app->make('router')->auth(); } 復制代碼所以Auth具體的路由方法都定義在Illuminate\Routing\Router的auth方法中,關于如何找到Facade類代理的實際類可以翻看之前Facade源碼分析的章節。
namespace Illuminate\Routing; class Router implements RegistrarContract, BindingRegistrar {/*** Register the typical authentication routes for an application.** @return void*/public function auth(){// Authentication Routes...$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');$this->post('login', 'Auth\LoginController@login');$this->post('logout', 'Auth\LoginController@logout')->name('logout');// Registration Routes...$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');} } 復制代碼在auth方法里可以清晰的看到認證系統里提供的所有功能的路由URI以及對應的控制器和方法。
使用Laravel的認證系統,幾乎所有東西都已經為你配置好了。其配置文件位于 config/auth.php,其中包含了用于調整認證服務行為的注釋清晰的選項配置。
<?phpreturn [/*|--------------------------------------------------------------------------| 認證的默認配置|--------------------------------------------------------------------------|| 設置了認證用的默認"看守器"和密碼重置的選項|*/'defaults' => ['guard' => 'web','passwords' => 'users',],/*|--------------------------------------------------------------------------| Authentication Guards|--------------------------------------------------------------------------|| 定義項目使用的認證看守器,默認的看守器使用session驅動和Eloquent User 用戶數據提供者|| 所有的驅動都有一個用戶提供者,它定義了如何從數據庫或者應用使用的持久化用戶數據的存儲中取出用戶信息|| Supported: "session", "token"|*/'guards' => ['web' => ['driver' => 'session','provider' => 'users',],'api' => ['driver' => 'token','provider' => 'users',],],/*|--------------------------------------------------------------------------| User Providers|--------------------------------------------------------------------------|| 所有的驅動都有一個用戶提供者,它定義了如何從數據庫或者應用使用的持久化用戶數據的存儲中取出用戶信息|| Laravel支持通過不同的Guard來認證用戶,這里可以定義Guard的用戶數據提供者的細節:| 使用什么driver以及對應的Model或者table是什么|| Supported: "database", "eloquent"|*/'providers' => ['users' => ['driver' => 'eloquent','model' => App\Models\User::class,],// 'users' => [// 'driver' => 'database',// 'table' => 'users',// ],],/*|--------------------------------------------------------------------------| 重置密碼相關的配置|--------------------------------------------------------------------------|*/'passwords' => ['users' => ['provider' => 'users','table' => 'password_resets','expire' => 60,],],]; 復制代碼Auth系統的核心是由 Laravel 的認證組件的「看守器」和「提供器」組成。看守器定義了該如何認證每個請求中用戶。例如,Laravel 自帶的 session 看守器會使用 session 存儲和 cookies 來維護狀態。
提供器中定義了該如何從持久化的存儲數據中檢索用戶。Laravel 自帶支持使用 Eloquent 和數據庫查詢構造器來檢索用戶。當然,你可以根據需要自定義其他提供器。
所以上面的配置文件的意思是Laravel認證系統默認使用了web guard配置項, 配置項里使用的是看守器是SessionGuard,使用的用戶提供器是EloquentProvider 提供器使用的model是App\User。
Guard
看守器定義了該如何認證每個請求中用戶。Laravel自帶的認證系統默認使用自帶的 SessionGuard ,SessionGuard除了實現\Illuminate\Contracts\Auth契約里的方法還實現Illuminate\Contracts\Auth\StatefulGuard 和Illuminate\Contracts\Auth\SupportsBasicAuth契約里的方法,這些Guard Contracts里定義的方法都是Laravel Auth系統默認認證方式依賴的基礎方法。
我們先來看一下這一些基礎方法都意欲完成什么操作,等到分析Laravel是如何通過SessionGuard認證用戶時在去關系這些方法的具體實現。
Illuminate\Contracts\Auth\Guard
這個文件定義了基礎的認證方法
namespace Illuminate\Contracts\Auth;interface Guard {/*** 返回當前用戶是否時已通過認證,是返回true,否者返回false** @return bool*/public function check();/*** 驗證是否時訪客用戶(非登錄認證通過的用戶)** @return bool*/public function guest();/*** 獲取當前用戶的用戶信息數據,獲取成功返回用戶User模型實例(\App\User實現了Authenticatable接口)* 失敗返回null* @return \Illuminate\Contracts\Auth\Authenticatable|null*/public function user();/*** 獲取當前認證用戶的用戶ID,成功返回ID值,失敗返回null** @return int|null*/public function id();/*** 通過credentials(一般是郵箱和密碼)驗證用戶** @param array $credentials* @return bool*/public function validate(array $credentials = []);/*** 將一個\App\User實例設置成當前的認證用戶** @param \Illuminate\Contracts\Auth\Authenticatable $user* @return void*/public function setUser(Authenticatable $user); }復制代碼Illuminate\Contracts\Auth\StatefulGuard
這個Contracts定義了Laravel auth系統里認證用戶時使用的方法,除了認證用戶外還會涉及用戶認證成功后如何持久化用戶的認證狀態。
<?phpnamespace Illuminate\Contracts\Auth;interface StatefulGuard extends Guard {/*** Attempt to authenticate a user using the given credentials.* 通過給定用戶證書來嘗試認證用戶,如果remember為true則在一定時間內記住登錄用戶* 認證通過后會設置Session和Cookies數據* @param array $credentials* @param bool $remember* @return bool*/public function attempt(array $credentials = [], $remember = false);/*** 認證用戶,認證成功后不會設置session和cookies數據** @param array $credentials* @return bool*/public function once(array $credentials = []);/*** 登錄用戶(用戶認證成功后設置相應的session和cookies)** @param \Illuminate\Contracts\Auth\Authenticatable $user* @param bool $remember* @return void*/public function login(Authenticatable $user, $remember = false);/*** 通過給定的用戶ID登錄用戶** @param mixed $id* @param bool $remember* @return \Illuminate\Contracts\Auth\Authenticatable*/public function loginUsingId($id, $remember = false);/*** 通過給定的用戶ID登錄用戶并且不設置session和cookies** @param mixed $id* @return bool*/public function onceUsingId($id);/*** Determine if the user was authenticated via "remember me" cookie.* 判斷用戶是否時通過name為"remeber me"的cookie值認證的* @return bool*/public function viaRemember();/*** 登出用戶** @return void*/public function logout(); }復制代碼Illuminate\Contracts\Auth\SupportsBasicAuth
定義了通過Http Basic Auth 認證用戶的方法
namespace Illuminate\Contracts\Auth;interface SupportsBasicAuth {/*** 嘗試通過HTTP Basic Auth來認證用戶** @param string $field* @param array $extraConditions* @return \Symfony\Component\HttpFoundation\Response|null*/public function basic($field = 'email', $extraConditions = []);/*** 進行無狀態的Http Basic Auth認證 (認證后不會設置session和cookies)** @param string $field* @param array $extraConditions* @return \Symfony\Component\HttpFoundation\Response|null*/public function onceBasic($field = 'email', $extraConditions = []); } 復制代碼User Provider
用戶提供器中定義了該如何從持久化的存儲數據中檢索用戶,Laravel定義了用戶提供器契約(interface),所有用戶提供器都要實現這個接口里定義的抽象方法,因為實現了統一的接口所以使得無論是Laravel 自帶的還是自定義的用戶提供器都能夠被Guard使用。
用戶提供器契約
如下是契約中定義的必需被用戶提供器實現的抽象方法:
<?phpnamespace Illuminate\Contracts\Auth;interface UserProvider {/*** 通過用戶唯一ID獲取用戶數據** @param mixed $identifier* @return \Illuminate\Contracts\Auth\Authenticatable|null*/public function retrieveById($identifier);/*** Retrieve a user by their unique identifier and "remember me" token.* 通過Cookies中的"remeber me"令牌和用戶唯一ID獲取用戶數據* @param mixed $identifier* @param string $token* @return \Illuminate\Contracts\Auth\Authenticatable|null*/public function retrieveByToken($identifier, $token);/*** 更新數據存儲中給定用戶的remeber me令牌** @param \Illuminate\Contracts\Auth\Authenticatable $user* @param string $token* @return void*/public function updateRememberToken(Authenticatable $user, $token);/*** 通過用戶證書獲取用戶信息** @param array $credentials* @return \Illuminate\Contracts\Auth\Authenticatable|null*/public function retrieveByCredentials(array $credentials);/*** 驗證用戶的證書** @param \Illuminate\Contracts\Auth\Authenticatable $user* @param array $credentials* @return bool*/public function validateCredentials(Authenticatable $user, array $credentials); } 復制代碼通過配置文件config/auth.php可以看到Laravel默認使用的用戶提供器是Illuminate\Auth\EloquentUserProvider , 下一章節我們分析Laravel Auth系統實現細節的時候我們再來看看EloquentUserProvider是怎么實現用戶提供器契約中的抽象方法的。
總結
本節我們主要介紹Laravel Auth系統的基礎,包括Auth系統的核心組件看守器和提供器,AuthManager通過調用配置文件里指定的看守器來完成用戶認證,在認證過程需要的用戶數據是看守器通過用戶提供器獲取到的,下面的表格里總結了Auth系統的核心部件以及每個部件的作用。
| Auth | AuthManager的Facade |
| AuthManager | Auth認證系統面向外部的接口,認證系統通過它向應用提供所有Auth用戶認證相關的方法,而認證方法的具體實現細節由它代理的具體看守器(Guard)來完成。 |
| Guard | 看守器,定義了該如何認證每個請求中用戶,認證時需要的用戶數據會通過用戶數據提供器來獲取。 |
| User Provider | 用戶提供器,定義了如何從持久化的存儲數據中檢索用戶,Guard認證用戶時會通過提供器取用戶的數據,所有的提供器都是\Illuminate\Contracts\Auth\UserProvider接口的實現,提供了從持久化存儲中取用戶數據的具體實現細節。 |
下一章節我們會看看Laravel自帶的用戶認證功能的實現細節。
本文已經收錄在系列文章Laravel源碼學習里,歡迎訪問閱讀。
總結
以上是生活随笔為你收集整理的Laravel核心代码学习--用户认证系统(基础介绍)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 调用模块,加入系统路径
- 下一篇: 4 .2 .4 配置存储系统