基于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实现框架(二)
Oct 09 PHP
用PHP伪造referer突破网盘禁止外连的代码
Jun 15 PHP
PHP 编程安全性小结
Jan 08 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
Mar 18 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
Jul 03 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
Oct 11 PHP
php字符串函数 str类常见用法示例
May 15 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
PHP与javascript的两种交互方式
2006/10/09 PHP
PHP 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
2016/04/12 Javascript
三种带箭头提示框总结实例
2016/06/14 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
Vue项目安装插件并保存
2019/01/28 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
js实现随机点名
2021/01/19 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
十个Python程序员易犯的错误
2015/12/15 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
python实现扫描ip地址的小程序
2019/04/16 Python
Python中Unittest框架的具体使用
2019/08/27 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
代码中finally中的代码会不会执行
2012/02/06 面试题
Pygame Time时间控制的具体使用详解
2021/11/17 Python