Laravel多域名下字段验证的方法


Posted in PHP onApril 04, 2019

前言

正在开发一个统一作者后台,用来让作者给网站提交软件。我们已经对其中一个网站开发了作者后台,现在我们打算将这一个后台提供给其他网站。它具备如下的一些特点:

  • 我们访问的域名是不一致的,解决方案见我的一篇文章,Laravel 路由研究之domain 解决多域名问题
  • 其次各个站点对后台的要求都是一致的,也就是说,一个后台N各站去用。

功能拆分

开始之前我们需要对系统各个功能点进行拆分,估算受影响的点:

登录注册

登录注册功能首当其冲,我们需要用户在注册时通过访问的域名不同,记录的身份也不同。所以我们需要进行如下的处理:

  • 增加字段identity
  • 进行判重
  • 进行登录验证

数据处理

  • 这个就不进行讨论了。根据用户所属身份不同,调用的数据也不同就行了。

注册判重

判重依据:

我们知道使用php artisan make:auth 后,默认使用email登录,在表单验证中默认对email进行判重。代码如下:

默认表单验证:

// Path:app/Http/Controllers/Auth/RegisterController.php
protected function validator(array $data)
{
 return Validator::make($data, [
 'name' => ['required', 'string', 'max:255'],
 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
 'password' => ['required', 'string', 'min:8', 'confirmed'],
 ]);
}

默认登录验证字段

// Path:vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
public function username()
{
 return 'email';
}
// 当然可以修改验证字段(看过文档的都知道),注意:登录验证字段必须是在表里面唯一的。

现在我们需要分析我们的需求:

在单一用户后台中,email判重已经足够了,但是对于多种用户一起使用就不太够了。

假设:我们有A,B两个域名,对应a,b两种用户,我们需要在一张表中存储a,b,首先我们判断a,b是属于那个域名的(站点),其次,看这个用户是否重复。

下面我们用Laravel表单验证来实现一下:

1、增加字段:

为方便演示,我直接在 make auth 生成的迁移文件上直接修改,大家不要在实际项目中直接修改,而是通过新建迁移文件,使用修改表结构的方式增加字段

public function up()
{
 Schema::create('users', function (Blueprint $table) {
 $table->bigIncrements('id');
 $table->string('name');
 $table->string('email'); // 去掉原来的unique
 $table->string('identity'); // 增加的字段
 $table->timestamp('email_verified_at')->nullable();
 $table->string('password');
 $table->rememberToken();
 $table->timestamps();
 });
}

注意: 在这个需求中,我们对迁移文件中的email和name字段不需要进行unique限定,因为他们的唯一性是有依赖的,不是独立的。

2、模拟用户注册,插入身份信息

// Path: app/Http/Controllers/Auth/RegisterController.php
protected function create(array $data)
{
 return User::create([
 'name' => $data['name'],
 'email' => $data['email'],
 'password' => Hash::make($data['password']),
 'identity' => 'pcsoft', // 模拟用户注册时,插入身份字段值
 ]);
}

3、进行判重处理

protected function validator(array $data)
{
 return Validator::make($data, [
 'name' => ['required', 'string', 'max:255'],
 'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->where(function ($query) {
  $query->where('identity', '=', 'onlinedown');
 })], // 这句话的意思:按照什么条件对 users 表中的 email 去重,我们需要按照身份字段等于我们访问的域名对 email 去重,
 'password' => ['required', 'string', 'min:8', 'confirmed'],
 ]);
}

4、测试

进行第一次注册,数据库截如下:

Laravel多域名下字段验证的方法

进行第二次注册,相同邮件,不同身份:

Laravel多域名下字段验证的方法

相同身份,相同邮箱测试

Laravel多域名下字段验证的方法

登录验证

覆写credentials,传入身份验证字段

// Path:app/Http/Controllers/Auth/LoginController.php
protected function credentials(Request $request)
{
 $request->merge(['identity' => Controller::getWebPrefix()]);
 return $request->only($this->username(), 'password', 'identity');
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP4之真OO
Oct 09 PHP
php 获取完整url地址
Dec 20 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
Jun 05 PHP
php 连接mysql连接被重置的解决方法
Feb 15 PHP
Zend Studio (eclipse)使用速度优化方法
Mar 23 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
Apr 20 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
Apr 02 PHP
Yii2分页的使用及其扩展方法详解
May 23 PHP
php  单例模式详细介绍及实现源码
Nov 05 PHP
PHP单态模式简单用法示例
Nov 16 PHP
vmware linux系统安装最新的php7图解
Apr 14 PHP
浅谈Laravel中使用Slack进行异常通知
May 29 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
Apr 04 #PHP
PHP设计模式之策略模式原理与用法实例分析
Apr 04 #PHP
Laravel路由研究之domain解决多域名问题的方法示例
Apr 04 #PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 #PHP
PHP示例演示发送邮件给某个邮箱
Apr 03 #PHP
PHP whois查询类定义与用法示例
Apr 03 #PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
Apr 03 #PHP
You might like
PHP 在线翻译函数代码
2009/05/07 PHP
PHP自动生成后台导航网址的最佳方法
2013/08/27 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
jquery maxlength使用说明
2011/09/09 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
js创建子窗口并且回传值示例代码
2013/07/02 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
2018/08/30 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
ES6如何用一句代码实现函数的柯里化
2020/01/18 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
春节到了 教你使用python来抢票回家
2020/01/06 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
基于Python测试程序是否有错误
2020/05/16 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
C#如何进行LDAP用户校验
2012/11/21 面试题
艺术设计专业个人求职信
2013/09/21 职场文书
卫校毕业生个人自我鉴定
2014/04/28 职场文书
食品流通安全承诺书
2014/05/22 职场文书
Mysql Show Profile
2021/04/05 MySQL
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android