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 相关文章推荐
无数据库的详细域名查询程序PHP版(3)
Oct 09 PHP
PHP脚本的10个技巧(6)
Oct 09 PHP
php 各种应用乱码问题的解决方法
May 09 PHP
批量获取memcache值并按key的顺序返回的实现代码
Jun 14 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
Jul 13 PHP
PHP中file_exists与is_file,is_dir的区别介绍
Sep 12 PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 PHP
CentOS安装php v8js教程
Feb 26 PHP
php搜索文件程序分享
Oct 30 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 PHP
Ubuntu 16.04下安装PHP 7过程详解
Mar 28 PHP
php把字符串指定字符分割成数组的方法
Mar 12 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
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
php 不同编码下的字符串长度区分
2009/09/26 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
js showModalDialog弹出窗口实例详解
2014/01/07 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
js跨域请求数据的3种常用的方法
2015/12/01 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
详解在Python和IPython中使用Docker
2015/04/28 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
英语专业毕业生自我鉴定
2013/11/09 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js