Maison  >  Article  >  développement back-end  >  Implémentation de la fonction de connexion multi-champs dans Laravel5.4

Implémentation de la fonction de connexion multi-champs dans Laravel5.4

巴扎黑
巴扎黑original
2018-05-18 15:20:151203parcourir

J'ai récemment rencontré un besoin au travail. Je dois réaliser l'effet de la connexion multi-champs, c'est-à-dire que vous pouvez vous connecter en utilisant n'importe quelle méthode de téléphone mobile ou de courrier électronique. Je vais maintenant partager le processus de solution, donc cet article. vous le présente principalement. Les informations pertinentes sur la mise en œuvre de la fonction de connexion multi-champs basée sur Laravel5.4 sont disponibles. Les amis dans le besoin peuvent s'y référer.

Avant-propos

Récemment, j'ai eu besoin d'implémenter une fonction de connexion multi-champs dans un projet. Pour faire simple, vous pouvez utiliser le nom d'utilisateur. , e-mail ou téléphone portable Connectez-vous de quelque manière que ce soit. Cet article vous présentera donc le contenu pertinent sur la connexion multi-champs Laravel5.4 et le partagera pour votre référence et votre étude. Sans plus tarder, jetons un coup d'œil à l'introduction détaillée.

Le contenu suivant est basé sur laravel5.4

La méthode est la suivante :

Tout d'abord, via l'outil artisanal Generate auth module

php artisan make:auth

À ce stade, un répertoire Auth sera ajouté au répertoire AppHttpControllers. Dans ce répertoire, il y a des contrôleurs liés à l'enregistrement. et la connexion. Certains contrôleurs liés à l'enregistrement seront également générés dans le répertoire resourcesviews. Vues liées à la connexion

La documentation officielle de Laravel indique que l'authentification manuelle des utilisateurs doit utiliser la méthode de tentative de la classe IlluminateSupportFacadesAuth, comme suit :

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
 /**
  * Handle an authentication attempt.
  *
  * @return Response
  */
 public function authenticate()
 {
  if (Auth::attempt([&#39;email&#39; => $email, &#39;password&#39; => $password])) {
   // Authentication passed...
   return redirect()->intended(&#39;dashboard&#39;);
  }
 }
}

Cette méthode déterminera la base de données en fonction des paramètres que vous transmettez. S'il existe un utilisateur correspondant, s'il existe et que le mot de passe est correct, il renvoie vrai, sinon il renvoie faux

Ensuite, j'ai ajouté cette méthode dans LoginController, mais elle semblait n'avoir aucun effet

J'ai donc commencé à observer le mécanisme d'implémentation de LoginController, j'ai découvert qu'il implémentait un trait d'AuthenticatesUsers, j'ai tracé le fichier de définition de ce trait, et j'ai trouvé que ce fichier est ce que nous voulons

Il contient une méthode de connexion, qui est responsable du traitement de la logique de connexion

/**
  * Handle a login request to the application.
  *
  * @param \Illuminate\Http\Request $request
  * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response
  */
 public function login(Request $request)
 {
  // 表单验证
  $this->validateLogin($request);

  // If the class is using the ThrottlesLogins trait, we can automatically throttle
  // the login attempts for this application. We&#39;ll key this by the username and
  // the IP address of the client making these requests into this application.
  // 防止暴力破解,多次登录失败会根据IP锁定
  if ($this->hasTooManyLoginAttempts($request)) {
   $this->fireLockoutEvent($request);

   return $this->sendLockoutResponse($request);
  }
  
  // 这个就是主要的负责判断数据库中是否存在相应的账号和密码的地方,我们需要重写的就是attemptLogin方法
  if ($this->attemptLogin($request)) {
   return $this->sendLoginResponse($request);
  }

  // If the login attempt was unsuccessful we will increment the number of attempts
  // to login and redirect the user back to the login form. Of course, when this
  // user surpasses their maximum number of attempts they will get locked out.
  // 登录失败,失败次数++,防止暴力破解
  $this->incrementLoginAttempts($request);

  // 返回失败响应
  return $this->sendFailedLoginResponse($request);
 }

Après avoir analysé une vague de ce fichier, j'ai trouvé que la méthode principale de connexion est la méthode tentativeLogin. Il suffit de réécrire cette méthode. Voyons d'abord comment la méthode originale est écrite et réécrivons-la en fonction de celle d'origine :

/**
  * Attempt to log the user into the application.
  *
  * @param \Illuminate\Http\Request $request
  * @return bool
  */
 protected function attemptLogin(Request $request)
 {
  return $this->guard()->attempt(
   $this->credentials($request), $request->has(&#39;remember&#39;)
  );
 }

Après la réécriture. le LoginController :

public function attemptLogin(Request $request)
 {
  $username = $request->input(&#39;username&#39;);
  $password = $request->input(&#39;password&#39;);

  // 验证用户名登录方式
  $usernameLogin = $this->guard()->attempt(
   [&#39;username&#39; => $username, &#39;password&#39; => $password], $request->has(&#39;remember&#39;)
  );
  if ($usernameLogin) {
   return true;
  }

  // 验证手机号登录方式
  $mobileLogin = $this->guard()->attempt(
   [&#39;mobile&#39; => $username, &#39;password&#39; => $password], $request->has(&#39;remember&#39;)
  );
  if ($mobileLogin) {
   return true;
  }

  // 验证邮箱登录方式
  $emailLogin = $this->guard()->attempt(
   [&#39;email&#39; => $username, &#39;password&#39; => $password], $request->has(&#39;remember&#39;)
  );
  if ($emailLogin) {
   return true;
  }

  return false;
 }

Utilisez simplement la méthode de tentative pour faire plusieurs jugements. Tant qu'il réussit, il retournera vrai. S'il échoue, continuez à utiliser d'autres champs pour juger. il renverra le test flase

, qui peut obtenir un effet de connexion multi-champs

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