基于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 相关文章推荐
FCKeditor添加自定义按钮
Mar 27 PHP
php创建多级目录代码
Jun 05 PHP
PHPThumb PHP 图片缩略图库
Mar 11 PHP
如何用php获取程序执行的时间
Jun 09 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
php die()与exit()的区别实例详解
Dec 03 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
laravel ORM 只开启created_at的几种方法总结
Jan 29 PHP
PHP分享图片的生成方法
Apr 25 PHP
php实现在线考试系统【附源码】
Sep 18 PHP
php实现微信分享朋友链接功能
Feb 18 PHP
Laravel 修改验证异常的响应格式实例代码详解
May 25 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 OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
Symfony控制层深入详解
2016/03/17 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
python中异常捕获方法详解
2017/03/03 Python
Python格式化输出%s和%d
2018/05/07 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
Python实现微信小程序支付功能
2019/07/25 Python
python2和python3实现在图片上加汉字的方法
2019/08/22 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
实习生自我鉴定范文
2013/12/05 职场文书
历史专业个人求职信范文
2013/12/07 职场文书
领导接待方案
2014/03/13 职场文书
财产公证书样本
2014/04/04 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
跑吧孩子观后感
2015/06/10 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android
php解析非标准json、非规范json的方式实例
2022/05/10 PHP
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS