前言正在开发统一的作者后台,让作者可以提交软件到网站。我们已经为其中一个站点开发了一个作者后端,现在我们计划将该后端提供给其他站点。它有以下特点:我们访问的域名不一致,解决方法可以参考我的一篇文章《Laravel路由研究领域解决多域名问题》其次,各个站点对后台的要求是一样的,即比如说,一个BackstageN站使用。在功能拆分开始之前,我们需要对系统的各个功能点进行拆分,并预估受影响点:登录注册功能首当其冲。我们需要用户注册不同的域名,记录身份。因此,我们需要进行如下处理:添加字段identity判断权重,进行登录验证数据处理。这个就不讨论了。根据用户的身份不同,调用的数据也不同。注册的权重判断依据:我们知道,使用phpartisanmake:auth后默认使用email登录,表单验证时默认判断email的权重。代码如下:默认表单验证://Path:app/Http/Controllers/Auth/RegisterController.phpprotectedfunctionvalidator(array$data){returnValidator::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.phppublicfunctionusername(){return'email';}//当然可以修改验证字段(看过文档的都知道),注意:登录验证字段必须是表中唯一的。现在需要分析一下我们的需求:单用户后台,邮件权重判断就够了,多用户一起使用就不行了。假设:我们有两个域名A和B,分别对应两类用户a和b。我们需要将a和b存储在一个表中。首先我们判断a和b属于那个域名(站点)。其次,检查用户是否重复。下面我们使用Laravel表单验证来实现:添加字段:为了演示方便,我直接修改了makeauth生成的迁移文件。实际项目中不要直接修改,而是新建一个迁移文件,使用修改后的表结构的方式添加字段publicfunctionup(){Schema::create('users',function(Blueprint$table){$table->bigIncrements('id');$table->string('name');$table->string('email');//去掉原来的唯一$table->string('identity');//添加字段$table->timestamp('email_verified_at')->nullable();$table->string('password');$table->rememberToken();$table->timestamps();});}注意:在这个需求中,我们不需要对迁移文件中的email和name字段设置唯一性限制,因为他们的唯一性是依赖的,不是独立的。模拟用户注册并插入身份信息//路径:app/Http/Controllers/Auth/RegisterController.phpprotectedfunctioncreate(array$data){returnUser::create(['name'=>$data['name'],'email'=>$data['email'],'password'=>Hash::make($data['password']),'identity'=>'pcsoft',//模拟用户注册字段时插入身份value]);}用于重判断处理protectedfunctionvalidator(array$data){returnValidator::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进行去重,我们需要根据identity字段等于domain对email进行去重namewevisit,'password'=>['required','string','min:8','confirmed'],]);}测试第一次注册,数据库如下:第二次注册,同一个邮箱,不同身份:同一个身份,同一个邮箱测试登录验证覆盖凭证,在认证字段传入//Path:app/Http/Controllers/Auth/LoginController.phpprotectedfunctioncredentials(Request$request){$request->merge(['identity'=>Controller::getWebPrefix()]);返回$request->only($this->username(),'password','identity');}
