在Laravel 5.1中扩展身份验证

时间:2015-09-23 13:18:36

标签: php laravel-5 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. 更新了登录和注册页面以包含额外的参数'domain'
  3. 在users表中添加了新列“domain” - 现在用户属于域
  4. 必须创建中间件才能在初始网站访问时从domains表中查找域ID。
  5. 用户表中的
  6. 必须将email和domain_id设置为唯一以防止重复:UNIQUE INDEX unique_email_domain_idemaildomain_id
  7. 需要针对功能验证器中的电子邮件更新注册页面上的验证,并将其替换为类似于'unique:users,email,NULL,id,domain_id,1'
  8. 的内容

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

    <?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);
        }
    }
    

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

1 个答案:

答案 0 :(得分:0)

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

  

当用户访问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并根据当前路由域覆盖发送到视图的数据。

你可以超级想象并传入任何特定于域的存储库文件,该文件充当任何&#34;核心&#34;的接口/过滤器。基于两个域之间的变化的功能...只有在扩展您为保持DRY原则而开发的核心类的域之间需要采取不同行为的事项时才使用此方法。