Maison >développement back-end >tutoriel php >Comment résoudre Laravel pour implémenter l'authentification multi-champs des utilisateurs
Cet article présente principalement comment résoudre le problème de la mise en œuvre de l'authentification utilisateur multi-champs dans Laravel. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer. a récemment rencontré quelqu'un au travail. Le problème nécessitait une vérification multi-champs, qui a finalement été résolue en recherchant des informations pertinentes. L'article suivant vous présente principalement la solution sur la façon dont Laravel implémente l'authentification multi-champs des utilisateurs. via un exemple de code. Amis qui en ont besoin Vous pouvez l'utiliser comme référence, jetons un coup d'œil ci-dessous.
Avant-proposCet article présente principalement le contenu pertinent sur l'authentification multi-champs des utilisateurs Laravel et le partage pour votre référence et votre étude. Mots suivants Pas grand chose à dire, jetons un œil à l'introduction détaillée.
Solution :
Les champs de connexion ne sont pas supérieurs à deux
J'ai vu une solution relativement simple en ligne, mais elle ne résout pas la validation des deux champs :
filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name'
Filtrez le contenu du formulaire dans la demande pour distinguer le nom d'utilisateur. Les inconvénients sont évidents. Si l'autre n'est pas l'e-mail, vous serez aveuglé... Voici une autre solution générale :
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); }
Comme vous pouvez le constater, même si cela peut résoudre le problème, cela va évidemment à l'encontre du style élégant de Laravel. Après tant de difficultés, je vais partager ma solution. avec toi.
Champs de connexion supérieurs ou égaux à trois (relativement compliqués)
Vous devez d'abord implémenter vous-même une implémentation d'IlluminateContractsAuthUserProvider. Pour plus de détails, veuillez vous référer à Ajout d'un fournisseur d'utilisateurs personnalisé, mais j'aime être paresseux, hérite directement d'EloquentUserProvider et remplace la méthode 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(); }
Remarque : va simplement changer en et c'est tout ! $query->where($key, $value);
$query->orWhere($key, $value);
Ensuite, vous devez enregistrer un UserProvider personnalisé :
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')); }); } }
Enfin, nous modifions la configuration de auth.php et c'est fait. Maintenant :
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'custom' => [ 'driver' => 'custom', 'model' => App\Models\User::class, ], ],
Modifiez le fournisseur du tableau Web vers la coutume précédemment enregistrée
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'custom', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
Maintenant, même si vous avez plusieurs champs, tout va bien...
Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'apprentissage de chacun. plus de contenu connexe, veuillez faire attention au site Web PHP chinois !
Recommandations associées :
À propos de la méthode d'implémentation de la connexion multi-champs dans Laravel5.4Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!