中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Laravel中對用戶多字段進行認證

發布時間:2021-01-26 16:48:17 來源:億速云 閱讀:191 作者:Leah 欄目:開發技術

如何在Laravel中對用戶多字段進行認證?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

解決方案:

  • 登錄字段不超過兩個的(簡單的解決方案)

  • 登錄字段大于或等于三個的(相對復雜一些)

登錄字段不超過兩個的

我在網上看到一種相對簡單解決方案,但是不能解決所有兩個字段的驗證:

filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name'

過濾請求中的表單內容,實現區分 username。弊端顯而易見,如果另一個不是 email 就抓瞎了……,下面是另一種通用的解決方案:

在 LoginController 中重寫 login 方法

public function login(Requests $request) {
 //假設字段是 email
 if ($this->guard()->attempt($request->only('email', 'password'))) {
  return $this->sendLoginResponse($request);
 }

 //假設字段是 mobile
 if ($this->guard()->attempt($request->only('mobile', 'password'))) {
  return $this->sendLoginResponse($request);
 }

 //假設字段是 username
 if ($this->guard()->attempt($request->only('username', 'password'))) {
  return $this->sendLoginResponse($request);
 }

 return $this->sendFailedLoginResponse($request);
}

可以看到雖然能解決問題,但是顯然有悖于 Laravel 的優雅風格,賣了這么多關子,下面跟大家分享一下我的解決方案。

登錄字段大于或等于三個的(相對復雜一些)

首先需要自己實現一個 Illuminate\Contracts\Auth\UserProvider 的實現,具體可以參考 添加自定義用戶提供器 但是我喜歡偷懶,就直接繼承了 EloquentUserProvider,并重寫了 retrieveByCredentials 方法:

public function retrieveByCredentials(array $credentials)
{
 if (empty($credentials)) {
  return;
 }

 // First we will add each credential element to the query as a where clause.
 // Then we can execute the query and, if we found a user, return it in a
 // Eloquent User "model" that will be utilized by the Guard instances.
 $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); 改為 $query->orWhere($key, $value); 就可以了!

緊接著需要注冊自定義的 UserProvider:

class AuthServiceProvider extends ServiceProvider
{
 /**
  * 注冊任何應用認證/授權服務。
  *
  * @return void
  */
 public function boot()
 {
  $this->registerPolicies();

  Auth::provider('custom', function ($app, array $config) {
   // 返回 Illuminate\Contracts\Auth\UserProvider 實例...

   return new CustomUserProvider(new BcryptHasher(), config('auth.providers.custom.model'));
  });
 }
}

最后我們修改一下 auth.php 的配置就搞定了:

'providers' => [
 'users' => [
  'driver' => 'eloquent',
  'model' => App\Models\User::class,
 ],

  'custom' => [
   'driver' => 'custom',
   'model' => App\Models\User::class,
  ],
],

將 web 數組的 provider 修改為前面注冊的那個 custom

'guards' => [
 'web' => [
  'driver' => 'session',
  'provider' => 'custom',
 ],

 'api' => [
  'driver' => 'passport',
  'provider' => 'users',
 ],
],

關于如何在Laravel中對用戶多字段進行認證問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

三河市| 富川| 包头市| 同心县| 贺兰县| 镇平县| 界首市| 射阳县| 晴隆县| 台州市| 沐川县| 军事| 景德镇市| 澄迈县| 赤城县| 南岸区| 新宾| 社会| 彩票| 应用必备| 泽普县| 张北县| 特克斯县| 松桃| 教育| 九龙县| 青神县| 龙里县| 铜梁县| 西华县| 巢湖市| 香河县| 灵武市| 黄浦区| 蒙自县| 陆丰市| 焉耆| 远安县| 微博| 仪征市| 舞钢市|