摘要:弊端顯而易見(jiàn),如果另一個(gè)不是就抓瞎了,下面是另一種通用的解決方案在中重寫(xiě)方法假設(shè)字段是假設(shè)字段是假設(shè)字段是可以看到雖然能解決問(wèn)題,但是顯然有悖于的優(yōu)雅風(fēng)格,賣(mài)了這么多關(guān)子,下面跟大家分享一下我的解決方案。
解決方案:
登錄字段不超過(guò)兩個(gè)的(簡(jiǎn)單的解決方案)
登錄字段大于或等于三個(gè)的(相對(duì)復(fù)雜一些)
登錄字段不超過(guò)兩個(gè)的我在網(wǎng)上看到一種相對(duì)簡(jiǎn)單解決方案,但是不能解決所有兩個(gè)字段的驗(yàn)證:
filter_var($request->input("login"), FILTER_VALIDATE_EMAIL) ? "email" : "name"
過(guò)濾請(qǐng)求中的表單內(nèi)容,實(shí)現(xiàn)區(qū)分 username。弊端顯而易見(jiàn),如果另一個(gè)不是 email 就抓瞎了……,下面是另一種通用的解決方案:
在 LoginController 中重寫(xiě) login 方法
public function login(Requests $request) { //假設(shè)字段是 email if ($this->guard()->attempt(["username" =>$request->only("email"), "password" => $request->only("password")]))) { return $this->sendLoginResponse($request); } //假設(shè)字段是 mobile if ($this->guard()->attempt(["username" =>$request->only("mobile"), "password" => $request->only("password")])) { return $this->sendLoginResponse($request); } //假設(shè)字段是 username if ($this->guard()->attempt(["username" =>$request->only("username"), "password" => $request->only("password")])) { return $this->sendLoginResponse($request); } return $this->sendFailedLoginResponse($request); }
可以看到雖然能解決問(wèn)題,但是顯然有悖于 Laravel 的優(yōu)雅風(fēng)格,賣(mài)了這么多關(guān)子,下面跟大家分享一下我的解決方案。
登錄字段大于或等于三個(gè)的(相對(duì)復(fù)雜一些)為了方便理解我畫(huà)了個(gè)大致的流程,只畫(huà)了我認(rèn)為重要的部分
首先需要自己實(shí)現(xiàn)一個(gè) IlluminateContractsAuthUserProvider 的實(shí)現(xiàn),具體可以參考 添加自定義用戶提供器 但是我喜歡偷懶,就直接繼承了 EloquentUserProvider,并重寫(xiě)了 retrieveByCredentials 方法:
public function retrieveByCredentials(array $credentials) { if (empty($credentials)) { return; } $query = $this->createModel()->newQuery(); foreach ($credentials as $key => $value) { if (! Str::contains($key, "password")) { $query->orWhere($key, $value); } } return $query->first(); }
注意: 全文關(guān)鍵的點(diǎn)就是框架自帶的 $query->where($key, $value);,也就是說(shuō)字段之間是 and 的關(guān)系;那么將 $query->where($key, $value); 改為 $query->orWhere($key, $value); 就可以了!
緊接著需要注冊(cè)自定義的 UserProvider:
class AuthServiceProvider extends ServiceProvider { /** * 注冊(cè)任何應(yīng)用認(rèn)證/授權(quán)服務(wù)。 * * @return void */ public function boot() { $this->registerPolicies(); Auth::provider("custom", function ($app, array $config) { // 返回 IlluminateContractsAuthUserProvider 實(shí)例... return new CustomUserProvider(new BcryptHasher(), config("auth.providers.custom.model")); }); } }
最后我們修改一下 auth.php 的配置就搞定了:
"providers" => [ "users" => [ "driver" => "eloquent", "model" => AppModelsUser::class, ], "custom" => [ "driver" => "custom", "model" => AppModelsUser::class, ], ],
將 web 數(shù)組的 provider 修改為前面注冊(cè)的那個(gè) custom
"guards" => [ "web" => [ "driver" => "session", "provider" => "custom", ], "api" => [ "driver" => "passport", "provider" => "users", ], ],
最后看一下 LoginController 的代碼:
public function login(LoginRequest $request) { $username = $request->get("username"); $result = $this->guard()->attempt([ "username" => $username, "email" => $username, "mobile" => $username, "password" => $request->get("password")]); if ($result) { return $this->sendLoginResponse($request); } $this->incrementLoginAttempts($request); return $this->sendFailedLoginResponse($request); }
現(xiàn)在哪怕你有在多個(gè)字段都妥妥的……??
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/25814.html
摘要:本文基于,主要介紹如何針對(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...
showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區(qū)優(yōu)秀文章 Laravel 5.5+passport 放棄 dingo 開(kāi)發(fā) API 實(shí)戰(zhàn),讓 API 開(kāi)發(fā)更省心 - 自造車(chē)輪。 API 文檔神器 Swagger 介紹及在 PHP 項(xiàng)目中使用 - API 文檔撰寫(xiě)方案 推薦 Laravel API 項(xiàng)目必須使用的 8 個(gè)...
摘要:新增了很多的新特性,包括了內(nèi)置多用戶認(rèn)證表單數(shù)組輸入驗(yàn)證隱式路由模型綁定中間件組的定義中間件訪問(wèn)頻率限制等主要功能。相對(duì)于變化有點(diǎn)大,簡(jiǎn)化了的目錄結(jié)構(gòu),并將路由分離出來(lái)。由于已將的路由單獨(dú)分離出來(lái),因此只需在中添加路由規(guī)則。 Laravel 5.2 新增了很多的新特性,包括了內(nèi)置多用戶認(rèn)證、表單數(shù)組輸入驗(yàn)證、隱式路由模型綁定、中間件組的定義、中間件 throttle 訪問(wèn)頻率限制等主要...
摘要:通過(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)...
摘要:本文來(lái)源于本人博客認(rèn)證解析以及改用加密驗(yàn)證的默認(rèn)登陸傳入郵件和用戶密碼到方法來(lái)認(rèn)證,通過(guò)的值獲取,如果用戶被找到,經(jīng)哈希運(yùn)算后存儲(chǔ)在數(shù)據(jù)中的將會(huì)和傳遞過(guò)來(lái)的經(jīng)哈希運(yùn)算處理的值進(jìn)行比較。 本文來(lái)源于本人博客: Laravel 5.2 Auth 認(rèn)證解析以及改用 salt+passwrod 加密驗(yàn)證 Larval 5.2的默認(rèn)Auth登陸傳入郵件和用戶密碼到attempt 方法來(lái)認(rèn)證,通過(guò)...
閱讀 1915·2021-11-09 09:46
閱讀 2492·2019-08-30 15:52
閱讀 2455·2019-08-30 15:47
閱讀 1325·2019-08-29 17:11
閱讀 1750·2019-08-29 15:24
閱讀 3508·2019-08-29 14:02
閱讀 2449·2019-08-29 13:27
閱讀 1209·2019-08-29 12:32