摘要:如果兩個(gè)經(jīng)哈希運(yùn)算的密碼相匹配那么將會(huì)為這個(gè)用戶開(kāi)啟一個(gè)認(rèn)證。如果認(rèn)證成功的話方法將會(huì)返回。重定向器上的方法將用戶重定向到登錄之前用戶想要訪問(wèn)的,在目標(biāo)無(wú)效的情況下回退將會(huì)傳遞給該方法。最后如有錯(cuò)誤,歡迎指出交流群
Auth認(rèn)證 路由
從路由開(kāi)始,找到源碼,再進(jìn)行研究
找到根目錄下面的
vendor/laravel/framework/src/Illuminate/Routing/Router.php
在282-303之間,具體代碼如下:
/** * 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"); // Registration Routes... $this->get("register", "AuthRegisterController@showRegistrationForm"); $this->post("register", "AuthRegisterController@register"); // Password Reset Routes... $this->get("password/reset", "AuthForgotPasswordController@showLinkRequestForm"); $this->post("password/email", "AuthForgotPasswordController@sendResetLinkEmail"); $this->get("password/reset/{token}", "AuthResetPasswordController@showResetForm"); $this->post("password/reset", "AuthResetPasswordController@reset"); }
其中一共有9種路由,登錄三種,注冊(cè)兩種,重置密碼有四種
登錄部分(login)登錄有3種,一種get方式的,兩種post方式的,顯然get方式的用來(lái)獲取登錄頁(yè)面,這個(gè)沒(méi)啥好說(shuō)啦,其中一種POST方式的是用來(lái)登出的,也就是logout,一種是登入,也就是login。
login($this->post("login", "AuthLoginController@login");)找到
vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
(如果不知道怎么找源碼的話,直接在編輯器中全局搜索showLoginForm)
在23-56行,就是我們的login方法
/** * Handle a login request to the application. * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function login(Request $request) { $this->validateLogin($request); // If the class is using the ThrottlesLogins trait, we can automatically throttle // the login attempts for this application. We"ll key this by the username and // the IP address of the client making these requests into this application. if ($lockedOut = $this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); return $this->sendLockoutResponse($request); } $credentials = $this->credentials($request); if ($this->guard()->attempt($credentials, $request->has("remember"))) { return $this->sendLoginResponse($request); } // If the login attempt was unsuccessful we will increment the number of attempts // to login and redirect the user back to the login form. Of course, when this // user surpasses their maximum number of attempts they will get locked out. if (! $lockedOut) { $this->incrementLoginAttempts($request); } return $this->sendFailedLoginResponse($request); }
也就是說(shuō),我們?cè)陧?yè)面上面點(diǎn)擊登錄按鈕,就會(huì)將請(qǐng)求提交到該方法。
下面我們來(lái)看看login方法的具體實(shí)現(xiàn)
首先
$this->validateLogin($request);
具體如58~69行:
/** * Validate the user login request. * * @param IlluminateHttpRequest $request * @return void */ protected function validateLogin(Request $request) { $this->validate($request, [ $this->username() => "required", "password" => "required", ]); }
這里只是校驗(yàn)了用戶名以及密碼是否為非空
回到login方法,校驗(yàn)完后
if ($lockedOut = $this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); return $this->sendLockoutResponse($request); }
這里面主要是對(duì)用戶登錄失敗次數(shù)的限制,如果登錄失敗次數(shù)過(guò)多就限制用戶登錄
接著,最重要的部分到啦$credentials = $this->credentials($request);
具體方法在71~80行,如下:
/** * Get the needed authorization credentials from the request. * * @param IlluminateHttpRequest $request * @return array */ protected function credentials(Request $request) { return $request->only($this->username(), "password"); }
這里返回了request請(qǐng)求里面的‘$this->username()’也就是email字段以及password字段的數(shù)據(jù)
然后根據(jù)上面得到的數(shù)據(jù),調(diào)用guard()進(jìn)行用戶認(rèn)證
if ($this->guard()->attempt($credentials, $request->has("remember"))) { return $this->sendLoginResponse($request); }
由guard()具體代碼可以看到(152-160行):
/** * Get the guard to be used during authentication. * * @return IlluminateContractsAuthStatefulGuard */ protected function guard() { return Auth::guard(); }
顯然用戶的具體賬號(hào)密碼的認(rèn)證用到了laravel的門(mén)面(Facades)來(lái)實(shí)現(xiàn)最后的用戶認(rèn)證
attempt($credentials, $request->has("remember"))
最后,
if (! $lockedOut) { $this->incrementLoginAttempts($request); } return $this->sendFailedLoginResponse($request);
如果認(rèn)證不通過(guò),這里將增加一次失敗的次數(shù)并返回相對(duì)應(yīng)的信息
經(jīng)過(guò)上面的分析,如果我們不想使用laravel自帶的認(rèn)證的話,我們可以直接使用 Laravel 認(rèn)證類來(lái)管理用戶認(rèn)證,例如
$email, "password" => $password])) { // Authentication passed... return redirect()->intended("dashboard"); } } }
attempt 方法接收鍵值數(shù)組對(duì)作為第一個(gè)參數(shù),數(shù)組中的值被用于從數(shù)據(jù)表中查找用戶,因此,在上面的例子中,用戶將會(huì)通過(guò)email 的值獲取,如果用戶被找到,經(jīng)哈希運(yùn)算后存儲(chǔ)在數(shù)據(jù)中的密碼將會(huì)和傳遞過(guò)來(lái)的經(jīng)哈希運(yùn)算處理的密碼值進(jìn)行比較。如果兩個(gè)經(jīng)哈希運(yùn)算的密碼相匹配那么將會(huì)為這個(gè)用戶開(kāi)啟一個(gè)認(rèn)證Session。
如果認(rèn)證成功的話 attempt 方法將會(huì)返回 true。否則,返回 false。
重定向器上的 intended 方法將用戶重定向到登錄之前用戶想要訪問(wèn)的 URL,在目標(biāo) URL 無(wú)效的情況下回退 URI 將會(huì)傳遞給該方法。
如果需要的話,除了用戶郵件和密碼之外還可以在認(rèn)證查詢時(shí)添加額外的條件,例如,我們可以驗(yàn)證被標(biāo)記為有效的用戶:
if (Auth::attempt(["email" => $email, "password" => $password, "active" => 1])) { // The user is active, not suspended, and exists. }
最后注:在這些例子中,并不僅僅限于使用 email 進(jìn)行登錄認(rèn)證,這里只是作為演示示例,你可以將其修改為數(shù)據(jù)庫(kù)中任何其他可用作“username”的字段。
如有錯(cuò)誤,歡迎指出
QQ交流群:489832466
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/22953.html
摘要:系統(tǒng)的核心是由的認(rèn)證組件的看守器和提供器組成。使用的認(rèn)證系統(tǒng),幾乎所有東西都已經(jīng)為你配置好了。其配置文件位于,其中包含了用于調(diào)整認(rèn)證服務(wù)行為的注釋清晰的選項(xiàng)配置。 用戶認(rèn)證系統(tǒng)(基礎(chǔ)介紹) 使用過(guò)Laravel的開(kāi)發(fā)者都知道,Laravel自帶了一個(gè)認(rèn)證系統(tǒng)來(lái)提供基本的用戶注冊(cè)、登錄、認(rèn)證、找回密碼,如果Auth系統(tǒng)里提供的基礎(chǔ)功能不滿足需求還可以很方便的在這些基礎(chǔ)功能上進(jìn)行擴(kuò)展。這篇...
摘要:本文基于,主要介紹如何針對(duì)多站點(diǎn)分別進(jìn)行用戶認(rèn)證的改造,用意是最大限度利用自帶的認(rèn)證系統(tǒng)。具體方案為清晰起見(jiàn),項(xiàng)目按照不同站點(diǎn)組織成不同模塊。學(xué)院版用戶認(rèn)證文檔版用戶認(rèn)證文檔更詳細(xì)學(xué)院版驗(yàn)證文檔版驗(yàn)證文檔更詳細(xì)翁航版多用戶認(rèn)證方案 原文發(fā)表于 http://www.jianshu.com/p/d6c112f27661 showImg(https://segmentfault.com/i...
摘要:擴(kuò)展用戶認(rèn)證系統(tǒng)上一節(jié)我們介紹了系統(tǒng)實(shí)現(xiàn)的一些細(xì)節(jié)知道了是如何應(yīng)用看守器和用戶提供器來(lái)進(jìn)行用戶認(rèn)證的,但是針對(duì)我們自己開(kāi)發(fā)的項(xiàng)目或多或少地我們都會(huì)需要在自帶的看守器和用戶提供器基礎(chǔ)之上做一些定制化來(lái)適應(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)用看守器和用戶提供器來(lái)進(jìn)行用戶認(rèn)證的,但是...
摘要:默認(rèn)的時(shí)間為周。大概意思就是如果用戶有一個(gè),那么他可以帶著他的過(guò)來(lái)領(lǐng)取新的,直到周的時(shí)間后,他便無(wú)法繼續(xù)刷新了,需要重新登錄。指定在刷新令牌時(shí)要保留的聲明密鑰。為了使令牌無(wú)效,您必須啟用黑名單。指定用于對(duì)用戶進(jìn)行身份驗(yàn)證的提供程序。 showImg(https://segmentfault.com/img/remote/1460000012606251?w=1920&h=1280); ...
摘要:通過(guò)裝載看守器和用戶提供器裝載看守器和用戶提供器用到的方法比較多,用文字描述不太清楚,我們通過(guò)注解這個(gè)過(guò)程中用到的方法來(lái)看具體的實(shí)現(xiàn)細(xì)節(jié)。 用戶認(rèn)證系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié) 上一節(jié)我們介紹來(lái)Laravel Auth系統(tǒng)的基礎(chǔ)知識(shí),說(shuō)了他的核心組件都有哪些構(gòu)成,這一節(jié)我們會(huì)專注Laravel Auth系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié),主要關(guān)注Auth也就是AuthManager是如何裝載認(rèn)證用的看守器(Guard)...
閱讀 1213·2021-11-25 09:43
閱讀 1969·2021-11-11 10:58
閱讀 1187·2021-11-08 13:18
閱讀 2659·2019-08-29 16:25
閱讀 3509·2019-08-29 12:51
閱讀 3307·2019-08-29 12:30
閱讀 748·2019-08-26 13:24
閱讀 3683·2019-08-26 10:38