首頁 >後端開發 >php教程 >解決Laravel實現用戶多字段認證

解決Laravel實現用戶多字段認證

巴扎黑
巴扎黑原創
2017-09-14 10:43:301281瀏覽

最近在工作中遇到一個問題,需要多字段的驗證,通過查找相關資料終於解決了,下面這篇文章主要給大家介紹了關於Laravel如何實現用戶多字段認證的解決方法,文中通過示例程式碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

本文主要介紹給大家介紹了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實現用戶多字段認證的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn