基于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 相关文章推荐
建立动态的WML站点(一)
Oct 09 PHP
php中支持多种编码的中文字符串截取函数!
Mar 20 PHP
仿AS3实现PHP 事件机制实现代码
Jan 27 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
Mar 20 PHP
解析htaccess伪静态的规则
Jun 18 PHP
php ci框架验证码实例分析
Jun 26 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 PHP
Zend Framework动作助手Url用法详解
Mar 05 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
Oct 15 PHP
PHP进阶学习之反射基本概念与用法分析
Jun 18 PHP
PHP命名空间用法实例分析
Sep 04 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后台程序与Javascript的两种交互方式
2009/10/25 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
python实现哈希表
2014/02/07 Python
python爬虫常用的模块分析
2014/08/29 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
python批量修改文件编码格式的方法
2018/05/31 Python
python3+pyqt5+itchat微信定时发送消息的方法
2019/02/20 Python
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
英国豪华文具和皮具配件经典老品牌:Smythson(斯迈森)
2018/04/19 全球购物
航空大学应届生求职信
2013/11/10 职场文书
大学生求职推荐信
2013/11/27 职场文书
女方回门宴答谢词
2014/01/14 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
庐山导游词
2015/02/03 职场文书
春节晚会开场白
2015/05/29 职场文书
法人身份证明书
2015/06/18 职场文书
python tkinter实现定时关机
2021/04/21 Python
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS
Java死锁的排查
2022/05/11 Java/Android
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis