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 相关文章推荐
第十节--抽象方法和抽象类
Nov 16 PHP
Cannot modify header information错误解决方法
Oct 08 PHP
比file_get_contents稳定的curl_get_contents分享
Jan 11 PHP
回帖脱衣服的图片实现代码
Feb 15 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
Oct 15 PHP
php去掉文件前几行的方法
Jul 29 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
May 05 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
Jun 17 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
Oct 18 PHP
详解PHP神奇又有用的Trait
Mar 25 PHP
windows 2008r2+php5.6.28环境搭建详细过程
Jun 18 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创建session的方法实例详解
2015/01/27 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
angularjs的一些优化小技巧
2014/12/06 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
2015/02/26 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
浅谈Python中的bs4基础
2018/10/21 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
浅析Python迭代器的高级用法
2020/07/16 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
shell程序中如何注释
2012/01/28 面试题
《母亲的恩情》教学反思
2014/02/13 职场文书
企业读书活动总结
2014/06/30 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
redis数据结构之压缩列表
2022/03/21 Redis