這篇文章主要介紹了關於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認證使用者時在去關係這些方法的具體實現。
IlluminateContractsAuthGuard
這個檔案定義了基礎的認證方法
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);}
IlluminateContractsAuthStatefulGuard
這個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();}
IlluminateContractsAuthSupportsBasicAuth
定義了通過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認證使用者時會通過提供器取使用者的資料,所有的提供器都是IlluminateContractsAuthUserProvider介面的實現,提供了從持久化儲存中取使用者資料的具體實現細節。 |
下一章節我們會看看Laravel內建的使用者認證功能的實現細節。
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!