基于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版(2)
Oct 09 PHP
PHP如何编写易读的代码
Jul 10 PHP
PHP 数组和字符串互相转换实现方法
Mar 26 PHP
php5.5中类级别的常量使用介绍
Oct 02 PHP
php实现四舍五入的方法小结
Mar 03 PHP
PHP CURL 多线程操作代码实例
May 13 PHP
PHP处理会话函数大总结
Aug 05 PHP
PHP简单实现文本计数器的方法
Apr 28 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
实例分析基于PHP微信网页获取用户信息
Nov 24 PHP
Yii2框架数据验证操作实例详解
May 02 PHP
PHP parse_ini_file函数的应用与扩展操作示例
Jan 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
dedecms模板标签代码官方参考
2007/03/17 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
PHP闭包实例解析
2014/09/08 PHP
PHP最常用的正则表达式
2017/02/13 PHP
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
javascript下function声明一些小结
2007/12/28 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
JS实现上下左右对称的九九乘法表
2016/02/22 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
详解js根据百度地图提供经纬度计算两点距离
2019/05/13 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python 性能优化技巧总结
2016/11/01 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
Mio Skincare法国官网:身体紧致及孕期身体护理
2018/04/04 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
北大研究生linux应用求职信
2013/10/29 职场文书
房产公证书范本
2014/04/10 职场文书
2014年教师节座谈会发言稿
2014/09/10 职场文书
2015年超市工作总结
2015/04/09 职场文书
通讯稿格式及范文
2015/07/22 职场文书
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android