最近、仕事で複数フィールドの認証が必要な問題に遭遇しました。関連情報を検索して最終的に解決しました。次の記事では、主に Laravel がユーザーの複数フィールド認証を実装する方法について説明します。非常に詳細に記載されているので、必要な友達は参照してください。以下を見てみましょう。
はじめに
この記事は主にLaravelユーザーのマルチフィールド認証に関する関連コンテンツを紹介し、参考と学習のために共有します。以下では多くを述べませんが、詳細を見てみましょう。導入。
解決策:
ログインフィールドは2つ以下にする(単純な解決策)
ログインフィールドは3つ以上(比較的複雑)
ログインフィールドは2つ以下にする
インターネット上で比較的単純な解決策を見ましたが、2 つのフィールドすべての検証を解決することはできません:
filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name'
username を区別するためにリクエスト内のフォームの内容をフィルターします。欠点は明らかです。もう 1 つが電子メールでない場合は、目が見えなくなります。別の一般的な解決策を次に示します。解決できますが、これは明らかに Laravel のエレガントなスタイルに反しているため、非常に多くの困難を経た後、私の解決策を共有します。
まず、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();
}
$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 サイトの他の関連記事を参照してください。