Maison >développement back-end >tutoriel php >Comment résoudre Laravel pour implémenter l'authentification multi-champs des utilisateurs

Comment résoudre Laravel pour implémenter l'authentification multi-champs des utilisateurs

不言
不言original
2018-06-13 16:46:04971parcourir

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 :

    Pas plus de deux champs de connexion (solution simple)
  • Les champs de connexion sont supérieurs ou égaux à trois (relativement compliqué)

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 :


Réécrivez la méthode de connexion dans LoginController

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.4


Ce 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn