基于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防注入安全代码
Apr 09 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
Jun 14 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 PHP
PHP实现模仿socket请求返回页面的方法
Nov 04 PHP
PHP中is_dir()函数使用指南
May 08 PHP
深入php内核之php in array
Nov 10 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 PHP
PHP使用file_get_content设置头信息的方法
Feb 14 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
[原创]php正则删除img标签的方法示例
May 27 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 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
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
给ECShop添加最新评论
2015/01/07 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
2016/04/13 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
解读Python编程中的命名空间与作用域
2015/10/16 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
Python中常用的8种字符串操作方法
2019/05/06 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
Bluebella法国官网:英国性感内衣品牌
2019/05/03 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
临床医学大学生求职信
2013/09/28 职场文书
自主招生自荐信范文
2013/12/04 职场文书
2014信息公开实施方案
2014/02/22 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
滞留工资返还协议书
2014/10/19 职场文书
作风建设年活动实施方案
2014/10/24 职场文书
优秀班集体申报材料
2014/12/25 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android
Python办公自动化PPT批量转换操作
2021/09/15 Python