前言

本文主要给大家介绍了关于Laravel用户多字段认证的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

解决方案:

登录字段不超过两个的(简单的解决方案)

登录字段大于或等于三个的(相对复杂一些)

登录字段不超过两个的

我在网上看到一种相对简单解决方案,但是不能解决所有两个字段的验证:

filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name'

过滤请求中的表单内容,实现区分 username。弊端显而易见,如果另一个不是 email 就抓瞎了……,下面是另一种通用的解决方案:

在 LoginController 中重写 login 方法

public function login(Requests $request) {

//假设字段是 email

if ($this->guard()->attempt($request->only('email', 'password'))) {

return $this->sendLoginResponse($request);

}

//假设字段是 mobile

if ($this->guard()->attempt($request->only('mobile', 'password'))) {

return $this->sendLoginResponse($request);

}

//假设字段是 username

if ($this->guard()->attempt($request->only('username', 'password'))) {

return $this->sendLoginResponse($request);

}

return $this->sendFailedLoginResponse($request);

}

可以看到虽然能解决问题,但是显然有悖于 Laravel 的优雅风格,卖了这么多关子,下面跟大家分享一下我的解决方案。

登录字段大于或等于三个的(相对复杂一些)

首先需要自己实现一个 Illuminate\Contracts\Auth\UserProvider 的实现,具体可以参考 添加自定义用户提供器 但是我喜欢偷懒,就直接继承了 EloquentUserProvider,并重写了 retrieveByCredentials 方法:

public function retrieveByCredentials(array $credentials)

{

if (empty($credentials)) {

return;

}

// First we will add each credential element to the query as a where clause.

// Then we can execute the query and, if we found a user, return it in a

// Eloquent User "model" that will be utilized by the Guard instances.

$query = $this->createModel()->newQuery();

foreach ($credentials as $key => $value) {

if (! Str::contains($key, 'password')) {

$query->orWhere($key, $value);

}

}

return $query->first();

}

注意:将 $query->where($key, $value);改为 $query->orWhere($key, $value);就可以了!

紧接着需要注册自定义的 UserProvider:

class AuthServiceProvider extends ServiceProvider

{

/**

* 注册任何应用认证/授权服务。

*

* @return void

*/

public function boot()

{

$this->registerPolicies();

Auth::provider('custom', function ($app, array $config) {

// 返回 Illuminate\Contracts\Auth\UserProvider 实例...

return new CustomUserProvider(new BcryptHasher(), config('auth.providers.custom.model'));

});

}

}

最后我们修改一下 auth.php 的配置就搞定了:

'providers' => [

'users' => [

'driver' => 'eloquent',

'model' => App\Models\User::class,

],

'custom' => [

'driver' => 'custom',

'model' => App\Models\User::class,

],

],

将 web 数组的 provider 修改为前面注册的那个 custom

'guards' => [

'web' => [

'driver' => 'session',

'provider' => 'custom',

],

'api' => [

'driver' => 'passport',

'provider' => 'users',

],

],

现在哪怕你有在多个字段都妥妥的…

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

php实现多字段unique验证,Laravel实现用户多字段认证的解决方法相关推荐

  1. 为什么ArcGIS 10.3导出 Shapefile的字段名会被截断成3个汉字?解决方法如下

    为什么ArcGIS 10.3导出 Shapefile的字段名会被截断成3个汉字?解决方法如下 参考文章: (1)为什么ArcGIS 10.3导出 Shapefile的字段名会被截断成3个汉字?解决方法 ...

  2. 苹果7设置不显示网络连接服务器,苹果ios7.1验证失败因为您不再连接到互联网解决方法...

    接下来带给大家的是ios7.1验证失败 因为您不再连接到互联网解决方法,有很多果粉在升级ios7.1的过程中遇到了"ios7.1验证失败,因为您不再连接到互联网"提示,这是为什么? ...

  3. php做异地登录验证,PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】

    本文实例讲述了PHP实现用户异地登录提醒功能的方法.分享给大家供大家参考,具体如下: 对于安全性要求比较高的web网站,特别是后台管理,有时候需要甄别自己的账号是否被盗或者是否有另一个人此刻登陆了在进 ...

  4. sql 2008 找不到本地服务器名称,出现在 sys.servers 中找不到服务器 apos;***\SQLEXPRESS’。请验证指定的服务器名称是否正确的解决方法 – 龙生时代...

    错误:Microsoft OLE DB Provider for SQL Server 错误 '80004005' 在 sys.servers 中找不到服务器 'SUNMAY2008\SQLEXPRE ...

  5. struts2 xml 验证出现 Invalid field value for field 的解决方法(转)

    缺省情况下, 所有的装换错误使用通用的i18n信息 xwork.default.invalid.fieldvalue , 你可以在你的全局il8n资源包中替换他(缺省文本是"Invalid ...

  6. excel中添加有效性验证或数据验证时不选择第一行列标题的解决方法

    [问题描述] excel中对列添加了数据验证(有效性验证)后,列标题也会存在数据选项,如图,姓名这个列标题竟然可以被姓名数据替换. [问题解决] 1. 数据-->数据验证 单独选中姓名这个单元格 ...

  7. access自动编号怎么解除_Access字段中“自动编号”类型不能再改回来的解决方法...

    从MYSQL数据库导出数据到ACCESS,在修改数据库字段类型时,遇到了"自动编号"无法改回来的情况,把其它类型改为自动编号,就会跳出 在表中输入了数据之后,则不能将任何字段数据类 ...

  8. 远程计算机未配置身份验证出现问题怎么办,Win10远程桌面连接出现身份验证错误要求的函数不受支持解决方法...

    最近有用户反馈在Win10系统下进行远程桌面连接的时候,连接到远程服务器时出现:现身份验证错误,要求的函数不受支持的错误提示,远程桌面无法连接,那么遇到这样的问题该如何解决呢?下面我们一起来看看如何解 ...

  9. IFrame中 Forms验证超时页面跳转跳出框架 简单解决方法

    在配置的登录页面上(例如:Login.aspx) 页面<head></head>中加入JavaScript代码: <script type="text/java ...

最新文章

  1. 暑期项目经验(十)--struts + poi
  2. POJ1321(棋盘问题)
  3. java的知识点12——==和equals方法、 super关键字、 继承树追溯、封装的作用和含义、封装的实现—使用访问控制符、封装的使用细节
  4. xshell 设置屏幕字体
  5. 停止从域服务器同步文件,域控制器不同步处理办法
  6. python nonlocal的用法_简谈Python3关键字nonlocal使用场景
  7. 如何让面试官认可你的简历
  8. stateless_Spring Stateless State Security第3部分:JWT +社会认证
  9. mysql分组查询获取分组中某个字段值最小的一条数据
  10. 重学C++语言之路:C++语言学习工具和环境
  11. 靠社交和游戏两张牌,腾讯还能活多久? | 畅言
  12. 智铺子微信扫码点餐系统有哪些可操作的功能
  13. uniaccess安全助手卸载
  14. vue+elementui最简单的面包屑写法
  15. 一对多GRE隧道配置
  16. 网页宽度打印出A4纸
  17. lotus 扇区一致性检测 删除错误扇区
  18. 对计算机影响最大的是温度对吗,电脑温度太高对零件有什么危害
  19. 如何下载延庆区卫星地图高清版大图
  20. 数字地和模拟地的区别

热门文章

  1. SELinux与SEAndroid
  2. Jenkins集成java非maven/ant项目的打包思路
  3. 作业调度框架_Quartz
  4. Python脚本配合Linux计划任务工作
  5. 日常检查IBM P系列小型机状态的项目及其相关命令
  6. APPSERV下安装pear db和auth
  7. IPv6 auto config 原理详解之-----前缀公告
  8. Forefront TMG2010中文版安装体验
  9. GitHub 5W 星:一行命令下载全网视频的两个开源项目
  10. 2020 操作系统第三天复习(习题总结)