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 相关文章推荐
人大复印资料处理程序_补充篇
Oct 09 PHP
sqlyog 中文乱码问题的设置方法
Oct 19 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 PHP
php var_export与var_dump 输出的不同
Aug 09 PHP
PHP小教程之实现链表
Jun 09 PHP
Codeigniter实现处理用户登录验证后的URL跳转
Jun 12 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
PHP框架自动加载类文件原理详解
Jun 06 PHP
Django中通过定时任务触发页面静态化的处理方式
Aug 29 PHP
PHP解析url并得到url参数方法总结
Oct 11 PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 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使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
通过php动态传数据到highcharts
2017/04/05 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
解析window.open的使用方法总结
2013/06/19 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
JavaScript 截取字符串代码实例
2019/09/05 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现类似jQuery使用中的链式调用的示例
2016/06/16 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
用python写PDF转换器的实现
2020/10/29 Python
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
宿舍保安职务说明书
2014/02/25 职场文书
升学宴主持词
2014/04/02 职场文书
《桥》教学反思
2014/04/09 职场文书
技术负责人任命书
2014/06/05 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
拖欠货款起诉状
2015/05/20 职场文书
SQL SERVER中的流程控制语句
2022/05/25 SQL Server