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 相关文章推荐
第四节 构造函数和析构函数 [4]
Oct 09 PHP
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 PHP
PHP修改session_id示例代码
Jan 08 PHP
Fedora下安装php Redis扩展笔记
Sep 03 PHP
PHP支付系统设计与典型案例分享
Aug 02 PHP
PHP经典算法集锦【经典收藏】
Sep 14 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
PHP的mysqli_rollback()函数讲解
Jan 23 PHP
phpinfo无法显示的原因及解决办法
Feb 15 PHP
详解PHP 7.4 中数组延展操作符语法知识点
Jul 19 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 PHP
Thinkphp5框架异常处理操作实例分析
Jun 03 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
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
js 获取、清空input type="file"的值(示例代码)
2013/12/24 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
AngularJS语法详解
2015/01/23 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
2018/04/22 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python函数返回值实例分析
2015/06/08 Python
Python3 伪装浏览器的方法示例
2017/11/23 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
详解Python的三种可变参数
2019/05/08 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
python+django+rest框架配置创建方法
2019/08/31 Python
简单了解python中的与或非运算
2019/09/18 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
某科技软件测试面试题
2013/05/19 面试题
在校生钳工实习自我鉴定
2013/09/19 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers