基于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操作MongoDB时的整数问题及对策说明
May 02 PHP
Apache2中实现多网站域名绑定的实现方法
Jun 01 PHP
PHP中改变图片的尺寸大小的代码
Jul 17 PHP
php之XML转数组函数的详解
Jun 07 PHP
WordPress中缩略图的使用以及相关技巧
Nov 24 PHP
如何使用GDB调试PHP程序
Dec 08 PHP
Yii模型操作之criteria查找数据库的方法
Jul 15 PHP
探究Laravel使用env函数读取环境变量为null的问题
Dec 06 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 PHP
PHP生成加减算法方式的验证码实例
Mar 12 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
thinkPHP5框架分页样式类完整示例
Sep 01 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
PHP7 错误处理机制修改
2021/03/09 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
在视频前插入广告
2006/11/20 Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
2017/05/12 Javascript
JavaScript中数组常见操作技巧
2017/09/01 Javascript
使用webpack3.0配置webpack-dev-server教程
2018/05/29 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
2019/11/21 Javascript
JavaScript 绘制饼图的示例
2021/02/19 Javascript
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
Python中使用ElementTree解析XML示例
2015/06/02 Python
详解Python locals()的陷阱
2019/03/26 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
django 模型字段设置默认值代码
2020/07/15 Python
CSS3过渡transition效果实例介绍
2016/05/03 HTML / CSS
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
突破canvas语法限制 让他支持链式语法
2012/12/24 HTML / CSS
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
求职意向书范文
2014/04/01 职场文书
优秀高中学生评语
2014/12/30 职场文书
小学生学习保证书
2015/02/26 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
信仰纪录片观后感
2015/06/08 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android