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实现的获取URL信息的类
Jan 02 PHP
用php实现批量查询清除一句话后门的代码
Jan 20 PHP
使用php验证复选框有效性的示例
Nov 13 PHP
php Calender(日历)代码分享
Jan 03 PHP
zf框架的zend_cache缓存使用方法(zend框架)
Mar 14 PHP
PHP四舍五入、取整、round函数使用示例
Feb 06 PHP
简单理解PHP的面向对象编程方式
May 17 PHP
PHP实现导出excel数据的类库用法示例
Oct 15 PHP
PHP自定义多进制的方法
Nov 03 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
PHP实现简单计算器小程序
Aug 28 PHP
php文件包含的几种方式总结
Sep 19 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面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
重新理解JavaScript的六种继承方式
2017/03/24 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
JavaScript函数Call、Apply原理实例解析
2020/02/17 Javascript
JS函数本身的作用域实例分析
2020/03/16 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
办公室助理岗位职责
2013/12/25 职场文书
打架检讨书100字
2014/01/08 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
MySQL 分页查询的优化技巧
2021/05/12 MySQL
Golang解析JSON对象
2022/04/30 Golang
vue使用element-ui按需引入
2022/05/20 Vue.js