摘要:到這里自帶的密碼重置的源碼解讀部分就完成了,下面我們就通過(guò)擴(kuò)展一下實(shí)現(xiàn)手機(jī)號(hào)密碼找回和自定義郵件發(fā)送方式找回密碼,根據(jù)上面的代碼解析如果你看懂的話應(yīng)該了解,其實(shí)我們只要擴(kuò)展和就可以了。
本文最早于發(fā)表本人博客: Laravel 自帶 Auth 密碼重置源碼解析及擴(kuò)展實(shí)現(xiàn)手機(jī)號(hào)密碼找回
Larval 自帶 Auth 密碼重置源碼解析及擴(kuò)展實(shí)現(xiàn)手機(jī)號(hào)密碼找回
Larval技術(shù)群小伙伴問(wèn)密碼重置時(shí)PasswordController中需要設(shè)置的$broker是干嘛用的,正好來(lái)寫一下Laravel 中Auth的ResetsPasswords,以及實(shí)踐一下擴(kuò)展,所以大體這篇博客寫寫:
密碼重置源碼分析
實(shí)現(xiàn)自定義郵件發(fā)送方式進(jìn)行密碼重置,比如使用第三方或者自己發(fā)送郵件方式找回
實(shí)現(xiàn)手機(jī)號(hào)密碼重置
首先來(lái)看一下PasswordController 中的 ResetsPasswords trait
trait ResetsPasswords { use RedirectsUsers; public function getEmail() { return $this->showLinkRequestForm(); } /** * 這里就是設(shè)置密碼重置郵件內(nèi)容的 * * @return IlluminateHttpResponse */ public function showLinkRequestForm() { //所以我們可以在PoasswrodController 中設(shè)置 protected $linkRequestView 來(lái)定義密碼重置郵件模板 if (property_exists($this, "linkRequestView")) { return view($this->linkRequestView); } if (view()->exists("auth.passwords.email")) { return view("auth.passwords.email"); } return view("auth.password"); } /** * 發(fā)送密碼重置郵件 * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function postEmail(Request $request) { return $this->sendResetLinkEmail($request); } /** * 給重置密碼的用戶發(fā)送郵件 * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function sendResetLinkEmail(Request $request) { $this->validate($request, ["email" => "required|email"]); $broker = $this->getBroker(); //獲取broker,下面會(huì)講 $response = Password::broker($broker)->sendResetLink($request->only("email"), function (Message $message) { $message->subject($this->getEmailSubject()); }); //根據(jù) broker 來(lái)發(fā)送密碼重置郵件,下面會(huì)詳細(xì)講 switch ($response) { case Password::RESET_LINK_SENT: //狀態(tài),下面會(huì)講 return $this->getSendResetLinkEmailSuccessResponse($response); case Password::INVALID_USER: default: return $this->getSendResetLinkEmailFailureResponse($response); } } /** * 郵件標(biāo)題 * * @return string */ protected function getEmailSubject() { return property_exists($this, "subject") ? $this->subject : "Your Password Reset Link"; } /** * 郵件成功發(fā)送過(guò)以后返回 * * @param string $response * @return SymfonyComponentHttpFoundationResponse */ protected function getSendResetLinkEmailSuccessResponse($response) { return redirect()->back()->with("status", trans($response)); } /** * 郵件發(fā)送時(shí)候返回 * * @param string $response * @return SymfonyComponentHttpFoundationResponse */ protected function getSendResetLinkEmailFailureResponse($response) { return redirect()->back()->withErrors(["email" => trans($response)]); } /** * 用戶點(diǎn)擊郵箱里面重置連接后跳轉(zhuǎn)的頁(yè)面,就是重置密碼頁(yè)面 * @param IlluminateHttpRequest $request * @param string|null $token * @return IlluminateHttpResponse */ public function getReset(Request $request, $token = null) { return $this->showResetForm($request, $token); } /** * 用戶點(diǎn)擊郵箱里面重置連接后跳轉(zhuǎn)的頁(yè)面,就是重置密碼頁(yè)面 * * @param IlluminateHttpRequest $request * @param string|null $token * @return IlluminateHttpResponse */ public function showResetForm(Request $request, $token = null) { if (is_null($token)) { return $this->getEmail(); } $email = $request->input("email"); //所以我們可以在PoasswrodController 中設(shè)置 protected $resetView 來(lái)定義密碼重置的頁(yè)面 if (property_exists($this, "resetView")) { return view($this->resetView)->with(compact("token", "email")); } if (view()->exists("auth.passwords.reset")) { return view("auth.passwords.reset")->with(compact("token", "email")); } return view("auth.reset")->with(compact("token", "email")); } /** * 重置密碼 * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function postReset(Request $request) { return $this->reset($request); } /** * 重置密碼實(shí)現(xiàn) * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function reset(Request $request) { $this->validate($request, [ "token" => "required", "email" => "required|email", "password" => "required|confirmed|min:6", ]); $credentials = $request->only( "email", "password", "password_confirmation", "token" ); $broker = $this->getBroker(); $response = Password::broker($broker)->reset($credentials, function ($user, $password) { //注意這個(gè)回調(diào) $this->resetPassword($user, $password); }); //根據(jù) broker重置密碼,下面會(huì)詳細(xì)講 switch ($response) { case Password::PASSWORD_RESET: return $this->getResetSuccessResponse($response); default: return $this->getResetFailureResponse($request, $response); } } /** * 重置密碼,并且重新登陸 * * @param IlluminateContractsAuthCanResetPassword $user * @param string $password * @return void */ protected function resetPassword($user, $password) { $user->password = bcrypt($password); $user->save(); Auth::guard($this->getGuard())->login($user); } //下面的代碼略 }
上面其實(shí)就是路由的實(shí)現(xiàn)方法,主要路由如下:
Method | URI | Action |
---|---|---|
POST | password/email | AppHttpControllersAuthPasswordController@sendResetLinkEmail |
POST | password/reset | AppHttpControllersAuthPasswordController@reset |
GET | HEAD | password/reset/{token?} |
首先來(lái)主要看下sendResetLinkEmail方法,這個(gè)方法主要實(shí)現(xiàn)根據(jù)用戶填入的郵箱地址來(lái)發(fā)送重置郵件的
$response = Password::broker($broker)->sendResetLink($request->only("email"), function (Message $message) { $message->subject($this->getEmailSubject()); }); //根據(jù) broker 來(lái)發(fā)送密碼重置郵件,下面會(huì)詳細(xì)講 switch ($response) { case Password::RESET_LINK_SENT: //狀態(tài),下面會(huì)講 return $this->getSendResetLinkEmailSuccessResponse($response); case Password::INVALID_USER: default: return $this->getSendResetLinkEmailFailureResponse($response); }
上面的Password 就是Facade,我們看一下這個(gè)Facade:
Illuminate/Support/Facades/Password.php
可以看到上面郵件發(fā)送后等狀態(tài)的判斷也是在這個(gè)Facade中定義的,那么auth.password 的這個(gè)是綁定到哪個(gè)類中實(shí)現(xiàn)的?繼續(xù)查看對(duì)應(yīng)的ServiceProvider的register
Illuminate/Auth/Passwords/PasswordResetServiceProvider.php
registerPasswordBroker(); } protected function registerPasswordBroker() { $this->app->singleton("auth.password", function ($app) { return new PasswordBrokerManager($app); }); $this->app->bind("auth.password.broker", function ($app) { return $app->make("auth.password")->broker(); }); } public function provides() { return ["auth.password", "auth.password.broker"]; } }看到了PasswordBrokerManager($app);,那么我們就知道了上面Passwrod::broker 的實(shí)現(xiàn)在PasswordBrokerManager中,那我們先來(lái)看下是如何發(fā)送這個(gè)重置密碼郵件的
Illuminate/Auth/Passwords/PasswordBrokerManager.php
getDefaultDriver(); return isset($this->brokers[$name]) ? $this->brokers[$name] : $this->brokers[$name] = $this->resolve($name); } /** * Resolve the given broker. * * @param string $name * @return IlluminateContractsAuthPasswordBroker * * @throws InvalidArgumentException */ protected function resolve($name) { $config = $this->getConfig($name); //獲取auth.php配置中的passwords broker if (is_null($config)) { throw new InvalidArgumentException("Password resetter [{$name}] is not defined."); } //這里很重要,就是實(shí)例一個(gè)PasswordBroker return new PasswordBroker( $this->createTokenRepository($config), $this->app["auth"]->createUserProvider($config["provider"]), $this->app["mailer"], $config["email"] ); } /** * 根據(jù)配置創(chuàng)建一個(gè)token實(shí)例 * * @param array $config * @return IlluminateAuthPasswordsTokenRepositoryInterface */ protected function createTokenRepository(array $config) { return new DatabaseTokenRepository( $this->app["db"]->connection(), $config["table"], $this->app["config"]["app.key"], $config["expire"] ); } //下面略 public function __call($method, $parameters) { return call_user_func_array([$this->broker(), $method], $parameters); } }上面的resolve返回了new PasswordBroker,這里的PasswordBroker其實(shí)才是密碼重置的核心實(shí)現(xiàn),里面主要做了實(shí)現(xiàn)一下幾件事情:
創(chuàng)建郵件驗(yàn)證的token,并發(fā)送重置密碼郵件
用戶點(diǎn)擊重置連接以后根據(jù)token進(jìn)行驗(yàn)證
重置舊的密碼成用戶提交的新密碼
Illuminate/Auth/Passwords/PasswordBroker.php
users = $users; $this->mailer = $mailer; $this->tokens = $tokens; $this->emailView = $emailView; } /** * 給用戶發(fā)送包含重置鏈接的郵件 * * @param array $credentials * @param Closure|null $callback * @return string */ public function sendResetLink(array $credentials, Closure $callback = null) { // 驗(yàn)證用戶 $user = $this->getUser($credentials); if (is_null($user)) { return PasswordBrokerContract::INVALID_USER; } // 生成token $token = $this->tokens->create($user); //發(fā)送郵件 $this->emailResetLink($user, $token, $callback); return PasswordBrokerContract::RESET_LINK_SENT; } /** * 發(fā)送郵件的實(shí)現(xiàn) * * @param IlluminateContractsAuthCanResetPassword $user * @param string $token * @param Closure|null $callback * @return int */ public function emailResetLink(CanResetPasswordContract $user, $token, Closure $callback = null) { //把token和user變量傳遞到郵件模板中,并發(fā)送郵件 $view = $this->emailView; return $this->mailer->send($view, compact("token", "user"), function ($m) use ($user, $token, $callback) { $m->to($user->getEmailForPasswordReset()); if (! is_null($callback)) { call_user_func($callback, $m, $user, $token); } }); } /** * 根據(jù)token重置密碼 * * @param array $credentials * @param Closure $callback * @return mixed */ public function reset(array $credentials, Closure $callback) { //實(shí)現(xiàn)根據(jù)$credentials來(lái)驗(yàn)證用戶是否可以更改更改密碼 $user = $this->validateReset($credentials); if (! $user instanceof CanResetPasswordContract) { return $user; } $pass = $credentials["password"]; // 下面這個(gè)就是產(chǎn)生新的密碼的實(shí)現(xiàn) call_user_func($callback, $user, $pass); $this->tokens->delete($credentials["token"]); return PasswordBrokerContract::PASSWORD_RESET; } //下面的是一些驗(yàn)證的方法,略 }上面的reset 中的call_user_func就是調(diào)用了重置新密碼的邏輯,$callback其實(shí)就是最上面的trait ResetsPasswords 中的resetPassword($user, $password)來(lái)保存新密碼。
到這里L(fēng)aravel 自帶Auth的密碼重置的源碼解讀部分就完成了,下面我們就通過(guò)擴(kuò)展一下實(shí)現(xiàn)手機(jī)號(hào)密碼找回和自定義郵件發(fā)送方式找回密碼,根據(jù)上面的代碼解析如果你看懂的話應(yīng)該了解,其實(shí)我們只要擴(kuò)展PasswordBroker.php和PasswordBrokerManager.php就可以了。
自定義郵件發(fā)送和手機(jī)號(hào)發(fā)送驗(yàn)證碼邏輯類請(qǐng)自行實(shí)現(xiàn),以下代碼的EmailService和SmsService分別表示發(fā)送郵件和發(fā)送短信的類,自己按照需求進(jìn)行封裝,比如SendCloud發(fā)送郵件,云通訊發(fā)送手機(jī)短信驗(yàn)證碼的具體實(shí)現(xiàn)
自定義郵件重置密碼的邏輯基本都一樣的,不變,手機(jī)號(hào)重置密碼的過(guò)程應(yīng)該是這樣的:
用戶填入手機(jī)號(hào),點(diǎn)擊“發(fā)送驗(yàn)證碼”按鈕,收到驗(yàn)證碼
將驗(yàn)證碼填入,點(diǎn)擊“密碼找回”
后臺(tái)進(jìn)行驗(yàn)證碼校驗(yàn),沒有問(wèn)題跳轉(zhuǎn)到新密碼設(shè)置頁(yè)面
新密碼設(shè)置
路由如下:
Route::post("password/email", "AuthPasswordController@sendResetLinkEmail"); //通過(guò)郵件重置密碼 Route::post("password/reset-mail", "AuthPasswordController@resetBymail"); //發(fā)送手機(jī)短信驗(yàn)證碼 Route::post("password/phone", "AuthPasswordController@sendResetCodePhone"); //通過(guò)手機(jī)驗(yàn)證碼找回密碼 Route::post("password/reset-phone", "AuthPasswordController@resetByPhone");在app目錄下建立入如下目錄和文件(根據(jù)個(gè)人習(xí)慣):
Foundation/ ├── Auth ?? ├── Passwords ?? ?? ├── RyanPasswordBroker.php ?? ?? ├── RyanPasswordBrokerManager.php ?? ?? └── Facade ?? ?? └── RyanPassword.php新建ServiceProvider,將auth.password綁定到我們自己的RyanPasswordBroker
app/Providers/RyanPasswordResetServiceProvider.php
registerPasswordBroker(); } protected function registerPasswordBroker() { $this->app->singleton("auth.password", function ($app) { return new RyanPasswordBrokerManager($app); }); $this->app->bind("auth.password.broker", function ($app) { return $app->make("auth.password")->broker(); }); } public function provides() { return ["auth.password", "auth.password.broker"]; } }修改config/app.php
"providers" => [ ...... AppProvidersRyanPasswordResetServiceProvider::class, ], "aliases" => [ ...... "RyanPassword" => AppFoundationAuthPasswordsFacadeRyanPassword::class, ],app/Foundation/Auth/Passwords/Facade/RyanPassword.php
app/Foundation/Auth/Passwords/RyanPasswordBroker.php
users = $users; $this->mailer = $mailer; $this->tokens = $tokens; $this->emailView = $emailView; } public function emailResetLink(CanResetPasswordContract $user, $token, Closure $callback = null) { $body = app("view")->make($this->emailView, compact("token", "user"))->render(); return $this->mailer->send($user->getEmailForPasswordReset(), "xxx賬號(hào)密碼重置", $body, $fromName = "xxxx"); } protected function validateReset(array $credentials) { if (is_null($user = $this->getUser($credentials))) { return PasswordBrokerContract::INVALID_USER; } if (!$this->validateNewPassword($credentials)) { return PasswordBrokerContract::INVALID_PASSWORD; } if (isset($credentials["verify_code"])) { //如果提交的字段含有verify_code表示是手機(jī)驗(yàn)證碼方式重置密碼,需要驗(yàn)證用戶提交的驗(yàn)證碼是不是剛才發(fā)送給他手機(jī)號(hào)的,驗(yàn)證碼發(fā)送以后可以保持在緩存中 if (Redis::get("password:telephone:" . $credentials["telephone"]) != $credentials["verify_code"]) { return PasswordBrokerContract::INVALID_TOKEN; } } elseif (!$this->tokens->exists($user, $credentials["token"])) { //郵件重置方式 return PasswordBrokerContract::INVALID_TOKEN; } return $user; } /** * Get the user for the given credentials. * * @param array $credentials * @return IlluminateContractsAuthCanResetPassword * * @throws UnexpectedValueException */ public function getUser(array $credentials) { $credentials = Arr::except($credentials, ["token", "verify_code"]);//這里注意,如果是手機(jī)驗(yàn)證碼方式找回密碼需要吧verify_code字段排除,以免users表中沒有verify_code字段查不到用戶 $user = $this->users->retrieveByCredentials($credentials); if ($user && !$user instanceof CanResetPasswordContract) { throw new UnexpectedValueException("User must implement CanResetPassword interface."); } return $user; } /** * 發(fā)送重置密碼手機(jī)驗(yàn)證碼 * * @param array $credentials * @param Closure|null $callback * @return string */ public function sendResetCode(array $credentials, Closure $callback = null) { $user = $this->getUser($credentials); if (is_null($user)) { return PasswordBrokerContract::INVALID_USER; } //我是將手機(jī)驗(yàn)證碼發(fā)送后保持在Redis中,驗(yàn)證的時(shí)候也是去redis取 $telephone = $credentials["telephone"]; $code = random_int(100000, 999999); $result = with(new SmsService())->sendTemplateSms($telephone, config("sms.template_ids.password_verify_code"), [$code]); $result = json_decode($result, true); if ($result["status"]) { Redis::setEx("password:telephone:" . $telephone, 3000, $code); return PasswordBrokerContract::RESET_LINK_SENT; } } /** * 通過(guò)手機(jī)驗(yàn)證碼重置密碼 * @param array $credentials * @param Closure $callback * @return CanResetPasswordContract|string */ public function resetByPhone(array $credentials, Closure $callback) { $user = $this->validateReset($credentials); if (!$user instanceof CanResetPasswordContract) { return $user; } $pass = $credentials["password"]; call_user_func($callback, $user, $pass); //如果是手機(jī)號(hào)重置密碼的話新密碼保存后需要?jiǎng)h除緩存的驗(yàn)證碼 Redis::del("password:telephone:" . $credentials["telephone"]); return PasswordBrokerContract::PASSWORD_RESET; } }app/Foundation/Auth/Passwords/RyanPasswordBrokerManager.php
mailer = new EmailService(); } /** * Attempt to get the broker from the local cache. * * @param string $name * @return IlluminateContractsAuthPasswordBroker */ public function broker($name = null) { $name = $name ?: $this->getDefaultDriver(); return isset($this->brokers[$name]) ? $this->brokers[$name] : $this->brokers[$name] = $this->resolve($name); } /** * Resolve the given broker. * * @param string $name * @return IlluminateContractsAuthPasswordBroker * * @throws InvalidArgumentException */ protected function resolve($name) { $config = $this->getConfig($name); if(is_null($config)) { throw new InvalidArgumentException("Password resetter [{$name}] is not defined."); } //這里實(shí)例化我們自定義的RyanPasswordBroker來(lái)完成密碼重置邏輯 return new RyanPasswordBroker($this->createTokenRepository($config), $this->app["auth"]->createUserProvider($config["provider"]), $this->mailer, $config["email"]); } }修改PasswordController.php
middleware("guest"); } /** * 發(fā)送重置密碼郵件 * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function sendResetLinkEmail(EmailResetPasswordSendRequest $request) { $broker = $this->getBroker(); $response = RyanPassword::broker($broker)->sendResetLink($request->only("email")); switch ($response) { case RyanPassword::RESET_LINK_SENT: return ["status_code" => "200", "message" => "密碼重置郵件已發(fā)送"]; case RyanPassword::INVALID_USER: default: throw new UnauthorizedHttpException(401, "該郵箱未注冊(cè)"); } } /** * 通過(guò)郵件重置密碼 * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function resetBymail(EmailResetPasswordRequest $request) { $credentials = $request->only("email", "password", "password_confirmation", "token"); $broker = $this->getBroker(); $response = RyanPassword::broker($broker)->reset($credentials, function ($user, $password) { $this->resetPassword($user, $password); }); switch ($response) { case RyanPassword::PASSWORD_RESET: unset($credentials["token"]); unset($credentials["password_confirmation"]); return [ "status_code" => "200", "message" => "密碼重置成功" ]; case RyanPassword::INVALID_TOKEN: //返回"Token 已經(jīng)失效" default: //返回"密碼重置失敗" } } /** * 發(fā)送重置密碼短信驗(yàn)證碼 * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function sendResetCodePhone(PhoneResetPasswordSendRequest $request) { $broker = $this->getBroker(); $response = RyanPassword::broker($broker)->sendResetCode($request->only("telephone")); switch ($response) { case RyanPassword::RESET_LINK_SENT: return ["status_code" => "200", "message" => "密碼重置驗(yàn)證碼已發(fā)送"]; case RyanPassword::INVALID_USER: default: //返回"該手機(jī)號(hào)未注冊(cè)" } } /** * 通過(guò)短信驗(yàn)證碼重置密碼 * @param PhoneResetPasswordRequest $request * @return array */ public function resetByPhone(PhoneResetPasswordRequest $request) { $credentials = $request->only("telephone", "password", "password_confirmation", "verify_code"); $broker = $this->getBroker(); $response = RyanPassword::broker($broker)->resetByPhone($credentials, function ($user, $password) { $this->resetPassword($user, $password); }); switch ($response) { case RyanPassword::PASSWORD_RESET: unset($credentials["verify_code"]); unset($credentials["password_confirmation"]); return [ "status_code" => "200", "message" => "密碼重置成功", ]; case RyanPassword::INVALID_TOKEN: //返回"手機(jī)驗(yàn)證碼已失效" default: //返回"密碼重置失敗" } } }結(jié)束!!
轉(zhuǎn)載請(qǐng)注明:?轉(zhuǎn)載自Ryan是菜鳥 | LNMP技術(shù)棧筆記
如果覺得本篇文章對(duì)您十分有益,何不 打賞一下
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30325.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的開發(fā)者都知道,Laravel自帶了一個(gè)認(rèn)證系統(tǒng)來(lái)提供基本的用戶注冊(cè)、登錄、認(rèn)證、找回密碼,如果Auth系統(tǒng)里提供的基礎(chǔ)功能不滿足需求還可以很方便的在這些基礎(chǔ)功能上進(jìn)行擴(kuò)展。這篇...
摘要:微信任意用戶密碼修改漏洞漏洞描述在微信官方的首頁(yè)上發(fā)現(xiàn)了找回密碼功能。選擇通過(guò)手機(jī)號(hào)碼找回密碼。提交成功,輸入新密碼。網(wǎng)易郵箱可直接修改其他用戶密碼描述這次我們看一個(gè)郵箱的找回密碼漏洞,這個(gè)還真和上面的方式有點(diǎn)不一樣。 來(lái)自 GitChat 作者:湯青松更多使用技術(shù),盡在微信公眾號(hào):GitChat技術(shù)雜談 進(jìn)入 GitChat 閱讀原文 WEB安全用戶密碼找回多案例安全攻防實(shí)戰(zhàn) 這次文...
摘要:擴(kuò)展用戶認(rèn)證系統(tǒng)上一節(jié)我們介紹了系統(tǒng)實(shí)現(xiàn)的一些細(xì)節(jié)知道了是如何應(yīng)用看守器和用戶提供器來(lái)進(jìn)行用戶認(rèn)證的,但是針對(duì)我們自己開發(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)證的,但是...
摘要:學(xué)習(xí)了一段時(shí)間的小結(jié)一下最近做的小任務(wù)寫下來(lái)才知道好亂糟糟,還是以記錄學(xué)習(xí)的資料為主,寫的很糟糕,還需要再揣度多屢屢思路。 學(xué)習(xí)了一段時(shí)間的laravel,小結(jié)一下最近做的laravel小任務(wù),寫下來(lái)才知道好亂糟糟,還是以記錄學(xué)習(xí)的資料為主,寫的很糟糕,還需要再揣度多屢屢思路。20151103-16 源碼地址:https://github.com/dingyiming/xc-add...
摘要:如果兩個(gè)經(jīng)哈希運(yùn)算的密碼相匹配那么將會(huì)為這個(gè)用戶開啟一個(gè)認(rèn)證。如果認(rèn)證成功的話方法將會(huì)返回。重定向器上的方法將用戶重定向到登錄之前用戶想要訪問(wèn)的,在目標(biāo)無(wú)效的情況下回退將會(huì)傳遞給該方法。最后如有錯(cuò)誤,歡迎指出交流群 Auth認(rèn)證 路由 從路由開始,找到源碼,再進(jìn)行研究找到根目錄下面的 vendor/laravel/framework/src/Illuminate/Routing/Rou...
閱讀 1646·2021-11-22 13:53
閱讀 2893·2021-11-15 18:10
閱讀 2793·2021-09-23 11:21
閱讀 2540·2019-08-30 15:55
閱讀 510·2019-08-30 13:02
閱讀 784·2019-08-29 17:22
閱讀 1732·2019-08-29 13:56
閱讀 3483·2019-08-29 11:31