摘要:弊端顯而易見,如果另一個不是就抓瞎了,下面是另一種通用的解決方案在中重寫方法假設字段是假設字段是假設字段是可以看到雖然能解決問題,但是顯然有悖于的優雅風格,賣了這么多關子,下面跟大家分享一下我的解決方案。
解決方案:
登錄字段不超過兩個的(簡單的解決方案)
登錄字段大于或等于三個的(相對復雜一些)
登錄字段不超過兩個的我在網上看到一種相對簡單解決方案,但是不能解決所有兩個字段的驗證:
filter_var($request->input("login"), FILTER_VALIDATE_EMAIL) ? "email" : "name"
過濾請求中的表單內容,實現區分 username。弊端顯而易見,如果另一個不是 email 就抓瞎了……,下面是另一種通用的解決方案:
在 LoginController 中重寫 login 方法
public function login(Requests $request) { //假設字段是 email if ($this->guard()->attempt(["username" =>$request->only("email"), "password" => $request->only("password")]))) { return $this->sendLoginResponse($request); } //假設字段是 mobile if ($this->guard()->attempt(["username" =>$request->only("mobile"), "password" => $request->only("password")])) { return $this->sendLoginResponse($request); } //假設字段是 username if ($this->guard()->attempt(["username" =>$request->only("username"), "password" => $request->only("password")])) { return $this->sendLoginResponse($request); } return $this->sendFailedLoginResponse($request); }
可以看到雖然能解決問題,但是顯然有悖于 Laravel 的優雅風格,賣了這么多關子,下面跟大家分享一下我的解決方案。
登錄字段大于或等于三個的(相對復雜一些)為了方便理解我畫了個大致的流程,只畫了我認為重要的部分
首先需要自己實現一個 IlluminateContractsAuthUserProvider 的實現,具體可以參考 添加自定義用戶提供器 但是我喜歡偷懶,就直接繼承了 EloquentUserProvider,并重寫了 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(); }
注意: 全文關鍵的點就是框架自帶的 $query->where($key, $value);,也就是說字段之間是 and 的關系;那么將 $query->where($key, $value); 改為 $query->orWhere($key, $value); 就可以了!
緊接著需要注冊自定義的 UserProvider:
class AuthServiceProvider extends ServiceProvider { /** * 注冊任何應用認證/授權服務。 * * @return void */ public function boot() { $this->registerPolicies(); Auth::provider("custom", function ($app, array $config) { // 返回 IlluminateContractsAuthUserProvider 實例... 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 數組的 provider 修改為前面注冊的那個 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); }
現在哪怕你有在多個字段都妥妥的……??
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25814.html
摘要:本文基于,主要介紹如何針對多站點分別進行用戶認證的改造,用意是最大限度利用自帶的認證系統。具體方案為清晰起見,項目按照不同站點組織成不同模塊。學院版用戶認證文檔版用戶認證文檔更詳細學院版驗證文檔版驗證文檔更詳細翁航版多用戶認證方案 原文發表于 http://www.jianshu.com/p/d6c112f27661 showImg(https://segmentfault.com/i...
showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區優秀文章 Laravel 5.5+passport 放棄 dingo 開發 API 實戰,讓 API 開發更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...
摘要:新增了很多的新特性,包括了內置多用戶認證表單數組輸入驗證隱式路由模型綁定中間件組的定義中間件訪問頻率限制等主要功能。相對于變化有點大,簡化了的目錄結構,并將路由分離出來。由于已將的路由單獨分離出來,因此只需在中添加路由規則。 Laravel 5.2 新增了很多的新特性,包括了內置多用戶認證、表單數組輸入驗證、隱式路由模型綁定、中間件組的定義、中間件 throttle 訪問頻率限制等主要...
摘要:通過裝載看守器和用戶提供器裝載看守器和用戶提供器用到的方法比較多,用文字描述不太清楚,我們通過注解這個過程中用到的方法來看具體的實現細節。 用戶認證系統的實現細節 上一節我們介紹來Laravel Auth系統的基礎知識,說了他的核心組件都有哪些構成,這一節我們會專注Laravel Auth系統的實現細節,主要關注Auth也就是AuthManager是如何裝載認證用的看守器(Guard)...
摘要:本文來源于本人博客認證解析以及改用加密驗證的默認登陸傳入郵件和用戶密碼到方法來認證,通過的值獲取,如果用戶被找到,經哈希運算后存儲在數據中的將會和傳遞過來的經哈希運算處理的值進行比較。 本文來源于本人博客: Laravel 5.2 Auth 認證解析以及改用 salt+passwrod 加密驗證 Larval 5.2的默認Auth登陸傳入郵件和用戶密碼到attempt 方法來認證,通過...
閱讀 1903·2021-11-09 09:46
閱讀 2486·2019-08-30 15:52
閱讀 2445·2019-08-30 15:47
閱讀 1319·2019-08-29 17:11
閱讀 1745·2019-08-29 15:24
閱讀 3500·2019-08-29 14:02
閱讀 2441·2019-08-29 13:27
閱讀 1198·2019-08-29 12:32