基于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.NET的入门教程
Oct 09 PHP
asp和php下textarea提交大量数据发生丢失的解决方法
Jan 20 PHP
深入php var_dump()函数的详解
Jun 05 PHP
深入apache host的配置详解
Jun 09 PHP
php使用smtp发送支持附件的邮件示例
Apr 13 PHP
php批量删除超链接的实现方法
Oct 19 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 PHP
WordPress中设置Post Type自定义文章类型的实例教程
May 10 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
May 20 PHP
php如何修改SESSION的生存存储时间的实例代码
Jul 05 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 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防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
php+highchats生成动态统计图
2014/05/21 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
Javascript setInterval的两种调用方法(实例讲解)
2013/11/29 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
Python3基础之基本运算符概述
2014/08/13 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
Python中bisect的使用方法
2019/12/31 Python
python绘制玫瑰的实现代码
2020/03/02 Python
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
英国Lookfantastic中文网站:护肤品美妆美发购物(英国直邮)
2020/04/27 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
中间件分为哪几类
2016/09/18 面试题
九年级化学教学反思
2014/01/28 职场文书
可口可乐广告词
2014/03/20 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
小学优秀班主任材料
2014/12/17 职场文书
2015年村计划生育工作总结
2015/04/28 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript