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

不言
Libérer: 2023-04-01 06:38:02
original
1012 Les gens l'ont consulté

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 :

1

filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name'

Copier après la connexion

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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);

}

Copier après la connexion

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 :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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();

}

Copier après la connexion

Remarque : va simplement changer en et c'est tout ! $query->where($key, $value); $query->orWhere($key, $value);
Ensuite, vous devez enregistrer un UserProvider personnalisé :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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'));

  });

 }

}

Copier après la connexion

Enfin, nous modifions la configuration de auth.php et c'est fait. Maintenant :

1

2

3

4

5

6

7

8

9

10

11

'providers' => [

 'users' => [

  'driver' => 'eloquent',

  'model' => App\Models\User::class,

 ],

 

  'custom' => [

   'driver' => 'custom',

   'model' => App\Models\User::class,

  ],

],

Copier après la connexion

Modifiez le fournisseur du tableau Web vers la coutume précédemment enregistrée

1

2

3

4

5

6

7

8

9

10

11

'guards' => [

 'web' => [

  'driver' => 'session',

  'provider' => 'custom',

 ],

 

 'api' => [

  'driver' => 'passport',

  'provider' => 'users',

 ],

],

Copier après la connexion

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!

Étiquettes associées:
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal