正在开发一个统一做者后台,用来让做者给网站提交软件。咱们已经对其中一个网站开发了做者后台,如今咱们打算将这一个后台提供给其余网站。它具有以下的一些特色:php
开始以前咱们须要对系统各个功能点进行拆分,估算受影响的点:laravel
登陆注册
登陆注册功能首当其冲,咱们须要用户在注册时经过访问的域名不一样,记录的身份也不一样。因此咱们须要进行以下的处理:数据库
identity
判重依据:
咱们知道使用php artisan make:auth
后,默认使用email登陆,在表单验证中默认对email进行判重。代码以下:segmentfault
默认表单验证:app
// 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'], ]); }
默认登陆验证字段dom
// 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表单验证来实现一下:ide
增长字段:
为方便演示,我直接在 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限定,由于他们的惟一性是有依赖的,不是独立的。网站
模拟用户注册,插入身份信息ui
// 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', // 模拟用户注册时,插入身份字段值 ]); }
进行判重处理
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'], ]); }
测试
覆写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'); }