基于Laravel5.4实现多字段登录功能方法示例


Posted in PHP onAugust 11, 2017

前言

最近在一个项目中需要实现一个多字段登录功能,简单来说就是可以使用用户名、邮箱或手机号任意一种方式进行登录。所以本文就来给大家介绍了关于Laravel5.4多字段登录的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍吧。

以下内容基于laravel5.4

方法如下:

首先,通过artisan工具生成auth模块

php artisan make:auth

这时候App\Http\Controllers目录下会新增一个Auth目录,该目录下为注册登录相关的控制器,resources\views目录下也会生成一些与注册登录相关的视图

laravel的官方文档中说手动认证用户需要使用Illuminate\Support\Facades\Auth类的attempt方法,如下:

<?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(['email' => $email, 'password' => $password])) {
   // Authentication passed...
   return redirect()->intended('dashboard');
  }
 }
}

这个方法会根据你传入的参数判断数据库中是否存在与之相匹配的用户,如果存在并且密码正确返回true,反之返回false

遂在LoginController中添加该方法,但是好像并没有效果

于是开始观察LoginController的实现机制,发现它实现了一个AuthenticatesUsers的trait,追踪到这个trait的定义文件,发现这个文件就是我们想要的东西

里面有一个login方法,就是负责处理登录的逻辑

/**
  * 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'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);
 }

分析了一波这个文件,发现主要进行登录判断的就是attemptLogin方法,我们只要重写这个方法即可,先看看原来的是怎么写的,根据原来的进行重写:

/**
  * 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('remember')
  );
 }

在LoginController重写后:

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

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

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

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

  return false;
 }

只需要用attempt方法进行多次判断即可,只要成功就返回true,不成功继续用其他字段进行判断,都不成功则返回flase

测试,可以实现多字段登录效果

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php xml文件操作代码(一)
Mar 20 PHP
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
PHP测试程序运行时间的类
Feb 05 PHP
php代码中使用换行及(\n或\r\n和br)的应用
Feb 02 PHP
php中文验证码实现示例分享
Jan 12 PHP
php使用curl获取https请求的方法
Feb 11 PHP
CodeIgniter针对数据库的连接、配置及使用方法
Mar 03 PHP
详解php几行代码实现CSV格式文件输出
Jul 01 PHP
php多进程应用场景实例详解
Jul 22 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 PHP
如何在PHP中读写文件
Sep 07 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
Aug 11 #PHP
关于PHP中协程和阻塞的一些理解与思考
Aug 11 #PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 #PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
Aug 11 #PHP
Redis在Laravel项目中的应用实例详解
Aug 11 #PHP
PHP验证码无法显示的原因及解决办法
Aug 11 #PHP
php readfile()修改文件上传大小设置
Aug 11 #PHP
You might like
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
js获取图片长和宽度的代码
2009/11/24 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
jQuery表单验证功能实例
2015/08/28 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
python类参数self使用示例
2014/02/17 Python
Python Socket编程入门教程
2014/07/11 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
python多线程并发实例及其优化
2019/06/27 Python
在python中用url_for构造URL的方法
2019/07/25 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
python ETL工具 pyetl
2020/06/07 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
Lookfantastic台湾:英国彩妆美发保养购物网
2018/03/26 全球购物
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
一年级学生评语大全
2014/04/21 职场文书
关于运动会的广播稿
2015/08/19 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书