繁体   English   中英

在Laravel 5.1中扩展身份验证

[英]Extending Authentication in Laravel 5.1

我有一个应用程序,类似于托管转售商得到的东西有所不同...该应用程序用于domainA.com和domainB.com。 两个域都指向一台服务器,因此两个站点都运行完全相同的文件和数据库的单个应用程序。

当用户访问domainA.com时,我们会看到domainA的特定首选项,即徽标和配色方案。 同样适用于domainB.com。

虽然两个域都使用单个数据库,但我希望userA能够使用相同的电子邮件在domainA和domainB上注册。 当用户尝试登录时,我们将使用类似于以下内容的内容:(摘自http://laravel.com/docs/master/authentication#authenticating-users

Auth::attempt(['email' => $email, 'password' => $password, 'site' => 'domainA.com'])

这是我需要的功能,用于保持数据分离,因此,如果您以属于domainA.com的adminA身份登录,您将看到userA在domainA.com上所做的操作,而adminA将看不到userA在domainB.com上进行的操作。 同样适用于属于domainB.com的adminB,adminB无法看到userA在domainA.com上所做的操作。

我想知道如果我要使用类似以下内容来更新默认的AuthController @ create方法,那么Laravel 5随附的整体身份验证将受到怎样的影响:

    protected function create(array $data)
    {        
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'site' => 'domainB.com'
        ]);
    }

我认为密码提醒可以轻松更新,但是由于Laravel的身份验证包括很多内置功能,因此除非使用身份验证用户的标识符来标识用户并执行核心功能,否则这可能会引起问题。


更新/这是我的位置

我已经完成了以下

  1. 在表用户中删除数据库中电子邮件的唯一条件
  2. 更新了登录和注册页面,以包括额外的参数“域”
  3. 在用户表中添加了新列“域”-现在用户属于域
  4. 必须创建中间件以在初始站点访问时从domains表中查找域id。
  5. 在用户表中必须有电子邮件和设置的Domain_ID独特,以防止重复:UNIQUE INDEX unique_email_domain_idemaildomain_id
  6. 注册页面上的验证需要在功能验证器中为电子邮件进行更新,并替换为类似于'unique:users,email,NULL,id,domain_id,1'的内容

还创建了一个中间件来创建带有数据的全局域变量,以下是一个初始示例:

<?php

namespace App\Http\Middleware;

use Closure;
use URL;

class DomainRouter
{
    /**
     * Handle an incoming request. Setting up domain for given session.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $domain= \App\Domain::where('domain', URL::to('/'))->firstOrFail();

        # config('domain')->id
        config([
            'domain' => $domain
        ]);

        return $next($request);
    }
}

必须通过重新创建代码来重新创建登录,注册和忘记密码,这些代码主要是从核心控制器复制过来的

站点应该与数据库无关,因为用户和域之间的数据库级别没有关系。

当用户访问domainA.com时,我们会看到domainA的特定首选项,即徽标和配色方案。 同样适用于domainB.com。

虽然两个域都使用单个数据库,但我希望userA能够使用相同的电子邮件在domainA和domainB上注册。

相反,您要做的就是显示不同的信息或在域之间提供不同的功能。

相反,您应该做的只是扩展auth函数/过滤器,当用户登录到特定域时,您可以先确定当前路由所在的域,然后再应用数据/视图/功能

例如:

MyController extends Controller
{

       public function view(ViewRepository $view)
    {

           return $view->make('path.to.my.view')
     }
}


}

ViewRepository扩展View的位置,并基于当前路由域覆盖发送到该视图的数据。

您可能会非常喜欢并传入任何域特定的存储库文件,该文件将基于两个域之间的更改充当任何“核心”功能的接口/过滤器。域扩展了您为维护DRY原理而开发的核心类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM