摘要:系統(tǒng)的核心是由的認(rèn)證組件的看守器和提供器組成。使用的認(rèn)證系統(tǒng),幾乎所有東西都已經(jīng)為你配置好了。其配置文件位于,其中包含了用于調(diào)整認(rèn)證服務(wù)行為的注釋清晰的選項(xiàng)配置。
用戶認(rèn)證系統(tǒng)(基礎(chǔ)介紹)
使用過Laravel的開發(fā)者都知道,Laravel自帶了一個(gè)認(rèn)證系統(tǒng)來提供基本的用戶注冊(cè)、登錄、認(rèn)證、找回密碼,如果Auth系統(tǒng)里提供的基礎(chǔ)功能不滿足需求還可以很方便的在這些基礎(chǔ)功能上進(jìn)行擴(kuò)展。這篇文章我們先來了解一下Laravel Auth系統(tǒng)的核心組件。
Auth系統(tǒng)的核心是由 Laravel 的認(rèn)證組件的「看守器」和「提供器」組成??词仄鞫x了該如何認(rèn)證每個(gè)請(qǐng)求中用戶。例如,Laravel 自帶的 session 看守器會(huì)使用 session 存儲(chǔ)和 cookies 來維護(hù)狀態(tài)。
下表列出了Laravel Auth系統(tǒng)的核心部件
名稱 | 作用 |
---|---|
Auth | AuthManager的Facade |
AuthManager | Auth認(rèn)證系統(tǒng)面向外部的接口,認(rèn)證系統(tǒng)通過它向應(yīng)用提供所有Auth用戶認(rèn)證相關(guān)的方法,而認(rèn)證方法的具體實(shí)現(xiàn)細(xì)節(jié)由它代理的具體看守器(Guard)來完成。 |
Guard | 看守器,定義了該如何認(rèn)證每個(gè)請(qǐng)求中用戶 |
User Provider | 用戶提供器,定義了如何從持久化的存儲(chǔ)數(shù)據(jù)中檢索用戶 |
在本文中我們會(huì)詳細(xì)介紹這些核心部件,然后在文章的最后更新每個(gè)部件的作用細(xì)節(jié)到上面給出的這個(gè)表中。
開始使用Auth系統(tǒng)只需在新的 Laravel 應(yīng)用上運(yùn)行?php artisan make:auth?和?php artisan migrate?命令就能夠在項(xiàng)目里生成Auth系統(tǒng)需要的路由和視圖以及數(shù)據(jù)表。
php artisan make:auth執(zhí)行后會(huì)生成Auth認(rèn)證系統(tǒng)需要的視圖文件,此外還會(huì)在路由文件web.php中增加響應(yīng)的路由:
Auth::routes();
Auth Facade文件中多帶帶定義了routes這個(gè)靜態(tài)方法
public static function routes() { static::$app->make("router")->auth(); }
所以Auth具體的路由方法都定義在IlluminateRoutingRouter的auth方法中,關(guān)于如何找到Facade類代理的實(shí)際類可以翻看之前Facade源碼分析的章節(jié)。
namespace IlluminateRouting; class Router implements RegistrarContract, BindingRegistrar { /** * Register the typical authentication routes for an application. * * @return void */ public function auth() { // Authentication Routes... $this->get("login", "AuthLoginController@showLoginForm")->name("login"); $this->post("login", "AuthLoginController@login"); $this->post("logout", "AuthLoginController@logout")->name("logout"); // Registration Routes... $this->get("register", "AuthRegisterController@showRegistrationForm")->name("register"); $this->post("register", "AuthRegisterController@register"); // Password Reset Routes... $this->get("password/reset", "AuthForgotPasswordController@showLinkRequestForm")->name("password.request"); $this->post("password/email", "AuthForgotPasswordController@sendResetLinkEmail")->name("password.email"); $this->get("password/reset/{token}", "AuthResetPasswordController@showResetForm")->name("password.reset"); $this->post("password/reset", "AuthResetPasswordController@reset"); } }
在auth方法里可以清晰的看到認(rèn)證系統(tǒng)里提供的所有功能的路由URI以及對(duì)應(yīng)的控制器和方法。
使用Laravel的認(rèn)證系統(tǒng),幾乎所有東西都已經(jīng)為你配置好了。其配置文件位于 config/auth.php,其中包含了用于調(diào)整認(rèn)證服務(wù)行為的注釋清晰的選項(xiàng)配置。
[ "guard" => "web", "passwords" => "users", ], /* |-------------------------------------------------------------------------- | Authentication Guards |-------------------------------------------------------------------------- | | 定義項(xiàng)目使用的認(rèn)證看守器,默認(rèn)的看守器使用session驅(qū)動(dòng)和Eloquent User 用戶數(shù)據(jù)提供者 | | 所有的驅(qū)動(dòng)都有一個(gè)用戶提供者,它定義了如何從數(shù)據(jù)庫或者應(yīng)用使用的持久化用戶數(shù)據(jù)的存儲(chǔ)中取出用戶信息 | | Supported: "session", "token" | */ "guards" => [ "web" => [ "driver" => "session", "provider" => "users", ], "api" => [ "driver" => "token", "provider" => "users", ], ], /* |-------------------------------------------------------------------------- | User Providers |-------------------------------------------------------------------------- | | 所有的驅(qū)動(dòng)都有一個(gè)用戶提供者,它定義了如何從數(shù)據(jù)庫或者應(yīng)用使用的持久化用戶數(shù)據(jù)的存儲(chǔ)中取出用戶信息 | | Laravel支持通過不同的Guard來認(rèn)證用戶,這里可以定義Guard的用戶數(shù)據(jù)提供者的細(xì)節(jié): | 使用什么driver以及對(duì)應(yīng)的Model或者table是什么 | | Supported: "database", "eloquent" | */ "providers" => [ "users" => [ "driver" => "eloquent", "model" => AppModelsUser::class, ], // "users" => [ // "driver" => "database", // "table" => "users", // ], ], /* |-------------------------------------------------------------------------- | 重置密碼相關(guān)的配置 |-------------------------------------------------------------------------- | */ "passwords" => [ "users" => [ "provider" => "users", "table" => "password_resets", "expire" => 60, ], ], ];
Auth系統(tǒng)的核心是由 Laravel 的認(rèn)證組件的「看守器」和「提供器」組成??词仄鞫x了該如何認(rèn)證每個(gè)請(qǐng)求中用戶。例如,Laravel 自帶的 session 看守器會(huì)使用 session 存儲(chǔ)和 cookies 來維護(hù)狀態(tài)。
提供器中定義了該如何從持久化的存儲(chǔ)數(shù)據(jù)中檢索用戶。Laravel 自帶支持使用 Eloquent 和數(shù)據(jù)庫查詢構(gòu)造器來檢索用戶。當(dāng)然,你可以根據(jù)需要自定義其他提供器。
所以上面的配置文件的意思是Laravel認(rèn)證系統(tǒng)默認(rèn)使用了web guard配置項(xiàng), 配置項(xiàng)里使用的是看守器是SessionGuard,使用的用戶提供器是EloquentProvider 提供器使用的model是AppUser。
Guard看守器定義了該如何認(rèn)證每個(gè)請(qǐng)求中用戶。Laravel自帶的認(rèn)證系統(tǒng)默認(rèn)使用自帶的 SessionGuard ,SessionGuard除了實(shí)現(xiàn)IlluminateContractsAuth契約里的方法還實(shí)現(xiàn)IlluminateContractsAuthStatefulGuard 和IlluminateContractsAuthSupportsBasicAuth契約里的方法,這些Guard Contracts里定義的方法都是Laravel Auth系統(tǒng)默認(rèn)認(rèn)證方式依賴的基礎(chǔ)方法。
我們先來看一下這一些基礎(chǔ)方法都意欲完成什么操作,等到分析Laravel是如何通過SessionGuard認(rèn)證用戶時(shí)在去關(guān)系這些方法的具體實(shí)現(xiàn)。
IlluminateContractsAuthGuard這個(gè)文件定義了基礎(chǔ)的認(rèn)證方法
namespace IlluminateContractsAuth; interface Guard { /** * 返回當(dāng)前用戶是否時(shí)已通過認(rèn)證,是返回true,否者返回false * * @return bool */ public function check(); /** * 驗(yàn)證是否時(shí)訪客用戶(非登錄認(rèn)證通過的用戶) * * @return bool */ public function guest(); /** * 獲取當(dāng)前用戶的用戶信息數(shù)據(jù),獲取成功返回用戶User模型實(shí)例(AppUser實(shí)現(xiàn)了Authenticatable接口) * 失敗返回null * @return IlluminateContractsAuthAuthenticatable|null */ public function user(); /** * 獲取當(dāng)前認(rèn)證用戶的用戶ID,成功返回ID值,失敗返回null * * @return int|null */ public function id(); /** * 通過credentials(一般是郵箱和密碼)驗(yàn)證用戶 * * @param array $credentials * @return bool */ public function validate(array $credentials = []); /** * 將一個(gè)AppUser實(shí)例設(shè)置成當(dāng)前的認(rèn)證用戶 * * @param IlluminateContractsAuthAuthenticatable $user * @return void */ public function setUser(Authenticatable $user); }IlluminateContractsAuthStatefulGuard
這個(gè)Contracts定義了Laravel auth系統(tǒng)里認(rèn)證用戶時(shí)使用的方法,除了認(rèn)證用戶外還會(huì)涉及用戶認(rèn)證成功后如何持久化用戶的認(rèn)證狀態(tài)。
IlluminateContractsAuthSupportsBasicAuth定義了通過Http Basic Auth 認(rèn)證用戶的方法
namespace IlluminateContractsAuth; interface SupportsBasicAuth { /** * 嘗試通過HTTP Basic Auth來認(rèn)證用戶 * * @param string $field * @param array $extraConditions * @return SymfonyComponentHttpFoundationResponse|null */ public function basic($field = "email", $extraConditions = []); /** * 進(jìn)行無狀態(tài)的Http Basic Auth認(rèn)證 (認(rèn)證后不會(huì)設(shè)置session和cookies) * * @param string $field * @param array $extraConditions * @return SymfonyComponentHttpFoundationResponse|null */ public function onceBasic($field = "email", $extraConditions = []); }User Provider用戶提供器中定義了該如何從持久化的存儲(chǔ)數(shù)據(jù)中檢索用戶,Laravel定義了用戶提供器契約(interface),所有用戶提供器都要實(shí)現(xiàn)這個(gè)接口里定義的抽象方法,因?yàn)閷?shí)現(xiàn)了統(tǒng)一的接口所以使得無論是Laravel 自帶的還是自定義的用戶提供器都能夠被Guard使用。
用戶提供器契約如下是契約中定義的必需被用戶提供器實(shí)現(xiàn)的抽象方法:
通過配置文件config/auth.php可以看到Laravel默認(rèn)使用的用戶提供器是IlluminateAuthEloquentUserProvider , 下一章節(jié)我們分析Laravel Auth系統(tǒng)實(shí)現(xiàn)細(xì)節(jié)的時(shí)候我們?cè)賮砜纯?b>EloquentUserProvider是怎么實(shí)現(xiàn)用戶提供器契約中的抽象方法的。
總結(jié)本節(jié)我們主要介紹Laravel Auth系統(tǒng)的基礎(chǔ),包括Auth系統(tǒng)的核心組件看守器和提供器,AuthManager通過調(diào)用配置文件里指定的看守器來完成用戶認(rèn)證,在認(rèn)證過程需要的用戶數(shù)據(jù)是看守器通過用戶提供器獲取到的,下面的表格里總結(jié)了Auth系統(tǒng)的核心部件以及每個(gè)部件的作用。
名稱 | 作用 |
---|---|
Auth | AuthManager的Facade |
AuthManager | Auth認(rèn)證系統(tǒng)面向外部的接口,認(rèn)證系統(tǒng)通過它向應(yīng)用提供所有Auth用戶認(rèn)證相關(guān)的方法,而認(rèn)證方法的具體實(shí)現(xiàn)細(xì)節(jié)由它代理的具體看守器(Guard)來完成。 |
Guard | 看守器,定義了該如何認(rèn)證每個(gè)請(qǐng)求中用戶,認(rèn)證時(shí)需要的用戶數(shù)據(jù)會(huì)通過用戶數(shù)據(jù)提供器來獲取。 |
User Provider | 用戶提供器,定義了如何從持久化的存儲(chǔ)數(shù)據(jù)中檢索用戶,Guard認(rèn)證用戶時(shí)會(huì)通過提供器取用戶的數(shù)據(jù),所有的提供器都是IlluminateContractsAuthUserProvider接口的實(shí)現(xiàn),提供了從持久化存儲(chǔ)中取用戶數(shù)據(jù)的具體實(shí)現(xiàn)細(xì)節(jié)。 |
下一章節(jié)我們會(huì)看看Laravel自帶的用戶認(rèn)證功能的實(shí)現(xiàn)細(xì)節(jié)。
本文已經(jīng)收錄在系列文章Laravel源碼學(xué)習(xí)里,歡迎訪問閱讀。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28910.html
摘要:擴(kuò)展用戶認(rèn)證系統(tǒng)上一節(jié)我們介紹了系統(tǒng)實(shí)現(xiàn)的一些細(xì)節(jié)知道了是如何應(yīng)用看守器和用戶提供器來進(jìn)行用戶認(rèn)證的,但是針對(duì)我們自己開發(fā)的項(xiàng)目或多或少地我們都會(huì)需要在自帶的看守器和用戶提供器基礎(chǔ)之上做一些定制化來適應(yīng)項(xiàng)目,本節(jié)我會(huì)列舉一個(gè)在做項(xiàng)目時(shí)遇到的 擴(kuò)展用戶認(rèn)證系統(tǒng) 上一節(jié)我們介紹了Laravel Auth系統(tǒng)實(shí)現(xiàn)的一些細(xì)節(jié)知道了Laravel是如何應(yīng)用看守器和用戶提供器來進(jìn)行用戶認(rèn)證的,但是...
摘要:過去一年時(shí)間寫了多篇文章來探討了我認(rèn)為的框架最核心部分的設(shè)計(jì)思路代碼實(shí)現(xiàn)。為了大家閱讀方便,我把這些源碼學(xué)習(xí)的文章匯總到這里。數(shù)據(jù)庫算法和數(shù)據(jù)結(jié)構(gòu)這些都是編程的內(nèi)功,只有內(nèi)功深厚了才能解決遇到的復(fù)雜問題。 過去一年時(shí)間寫了20多篇文章來探討了我認(rèn)為的Larave框架最核心部分的設(shè)計(jì)思路、代碼實(shí)現(xiàn)。通過更新文章自己在軟件設(shè)計(jì)、文字表達(dá)方面都有所提高,在剛開始決定寫Laravel源碼分析地...
摘要:通過裝載看守器和用戶提供器裝載看守器和用戶提供器用到的方法比較多,用文字描述不太清楚,我們通過注解這個(gè)過程中用到的方法來看具體的實(shí)現(xiàn)細(xì)節(jié)。 用戶認(rèn)證系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié) 上一節(jié)我們介紹來Laravel Auth系統(tǒng)的基礎(chǔ)知識(shí),說了他的核心組件都有哪些構(gòu)成,這一節(jié)我們會(huì)專注Laravel Auth系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié),主要關(guān)注Auth也就是AuthManager是如何裝載認(rèn)證用的看守器(Guard)...
摘要:的契約是一組定義框架提供的核心服務(wù)的接口,例如我們?cè)诮榻B用戶認(rèn)證的章節(jié)中到的用戶看守器契約和用戶提供器契約以及框架自帶的模型所實(shí)現(xiàn)的契約。接口與團(tuán)隊(duì)開發(fā)當(dāng)你的團(tuán)隊(duì)在開發(fā)大型應(yīng)用時(shí),不同的部分有著不同的開發(fā)速度。 Contracts Laravel 的契約是一組定義框架提供的核心服務(wù)的接口, 例如我們?cè)诮榻B用戶認(rèn)證的章節(jié)中到的用戶看守器契約IllumninateContractsAuth...
摘要:如何做用戶認(rèn)證根據(jù)文檔描述,提供用戶認(rèn)證的接口,他的核心是看守器和提供器,看守器定義怎么認(rèn)證用戶,提供器定義怎么檢索用戶。 最近的一個(gè)PHP項(xiàng)目,上一個(gè)項(xiàng)目是采用ThinkPHP來弄的,因?yàn)楹茉缇吐犝f過Laravel的大名,所以進(jìn)了Laravel的官網(wǎng),意外發(fā)現(xiàn)了Lumen,正好我項(xiàng)目是提供API的,所以選擇了Lumen,因?yàn)槭荓aravel的精簡(jiǎn)版,看了幾天的Laravel文檔,也總...
閱讀 3272·2021-11-15 11:37
閱讀 1085·2021-11-02 14:45
閱讀 3905·2021-09-04 16:48
閱讀 3582·2019-08-30 15:55
閱讀 757·2019-08-23 17:53
閱讀 1000·2019-08-23 17:03
閱讀 2032·2019-08-23 16:43
閱讀 2191·2019-08-23 16:22