Laravelを解決してユーザーの複数フィールド認証を実装する

巴扎黑
リリース: 2023-03-16 07:28:02
オリジナル
1245 人が閲覧しました

最近、仕事で複数フィールドの認証が必要な問題に遭遇しました。関連情報を検索して最終的に解決しました。次の記事では、主に Laravel がユーザーの複数フィールド認証を実装する方法について説明します。非常に詳細に記載されているので、必要な友達は参照してください。以下を見てみましょう。

はじめに

この記事は主にLaravelユーザーのマルチフィールド認証に関する関連コンテンツを紹介し、参考と学習のために共有します。以下では多くを述べませんが、詳細を見てみましょう。導入。

解決策:

  • ログインフィールドは2つ以下にする(単純な解決策)

  • ログインフィールドは3つ以上(比較的複雑)

ログインフィールドは2つ以下にする

インターネット上で比較的単純な解決策を見ましたが、2 つのフィールドすべての検証を解決することはできません:


filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name'
ログイン後にコピー

username を区別するためにリクエスト内のフォームの内容をフィルターします。欠点は明らかです。もう 1 つが電子メールでない場合は、目が見えなくなります。別の一般的な解決策を次に示します。解決できますが、これは明らかに Laravel のエレガントなスタイルに反しているため、非常に多くの困難を経た後、私の解決策を共有します。

ログインフィールドが 3 つ以上の場合 (比較的複雑)

まず、IlluminateContractsAuthUserProvider の実装を自分で実装する必要があります。詳細については、「カスタム ユーザー プロバイダーの追加」を参照してください。なので、EloquentUserProvider を直接継承して RetrieveByCredentials メソッドを書き直しました:


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);
}
ログイン後にコピー

注:

を置き換えてください。


次に、カスタム UserProvider を登録する必要があります:

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();
}
ログイン後にコピー
最後に、auth.php の設定を変更して完了です:$query->where($key, $value); 改为 $query->orWhere($key, $value);

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'));
  });
 }
}
ログイン後にコピー

Web 配列のプロバイダを、登録されているカスタム プロバイダに変更します。先ほど


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

  'custom' => [
   'driver' => 'custom',
   'model' => App\Models\User::class,
  ],
],
ログイン後にコピー

複数のフィールドがある場合でも...

以上がLaravelを解決してユーザーの複数フィールド認証を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート