Ich bin kürzlich bei der Arbeit auf ein Problem gestoßen, das eine Mehrfeld-Verifizierung erforderte. Ich habe es schließlich gelöst, indem ich nach relevanten Informationen gesucht habe. Der folgende Artikel stellt Ihnen hauptsächlich die Lösung vor, wie Laravel die Benutzer-Mehrfeld-Authentifizierung implementiert Die Code-Einführung ist sehr detailliert. Freunde, die sie benötigen, können sich darauf beziehen.
Vorwort
Dieser Artikel stellt hauptsächlich den relevanten Inhalt zur Laravel-Benutzer-Mehrfeldauthentifizierung vor und teilt ihn als Referenz und zum Studium Folgende Worte Mehr gibt es nicht zu sagen, werfen wir einen Blick auf die ausführliche Einleitung.
Lösung:
Nicht mehr als zwei Login-Felder (einfache Lösung)
Anmeldefelder sind größer oder gleich drei (relativ kompliziert)
Anmeldefelder sind nicht mehr als zwei
Ich habe online eine relativ einfache Lösung gesehen, die jedoch nicht die Validierung aller beiden Felder löst:
filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name'
Filter Der Formularinhalt in der Anfrage zur Unterscheidung des Benutzernamens. Die Nachteile liegen auf der Hand. Wenn die andere keine E-Mail ist, werden Sie geblendet ... Hier ist eine weitere allgemeine Lösung:
Die Anmeldemethode in LoginController neu schreiben
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); }
Sie sehen, dass es zwar das Problem lösen kann, aber offensichtlich im Widerspruch zum eleganten Stil von Laravel steht und so viel gekostet hat. Ich werde meine Lösung unten mit Ihnen teilen .
Anmeldefelder größer oder gleich drei (relativ kompliziert)
Zuerst müssen Sie selbst eine Implementierung von IlluminateContractsAuthUserProvider implementieren. Weitere Informationen finden Sie unter Hinzufügen eines benutzerdefinierten Benutzeranbieters. aber ich bin gerne faul. , erbt direkt EloquentUserProvider und überschreibt die Methode „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(); }
Hinweis: wird sei $query->where($key, $value);
Ändere es einfach in $query->orWhere($key, $value);
!
Dann müssen Sie einen benutzerdefinierten UserProvider registrieren:
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')); }); } }
Zuletzt ändern wir die Konfiguration von auth.php und fertig:
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'custom' => [ 'driver' => 'custom', 'model' => App\Models\User::class, ], ],
Ändern Sie den Anbieter des Web-Arrays auf den zuvor registrierten Benutzerdefiniert
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'custom', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
Jetzt auch wenn Sie Es funktioniert in mehreren Bereichen gut...
Das obige ist der detaillierte Inhalt vonLösen Sie Laravel, um die Benutzerauthentifizierung mit mehreren Feldern zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!