【问题标题】:Extending Authentication in Laravel 5.1在 Laravel 5.1 中扩展身份验证
【发布时间】:2015-09-23 13:18:35
【问题描述】:

我有一个应用程序,类似于托管经销商得到的不同的东西......这个应用程序用于 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 在域名B.com。同样适用于属于 domainB.com 的 adminB,adminB 将无法看到 userA 在 domainA.com 上做了什么。

我想知道 Laravel 5 提供的整体身份验证是否会受到影响,如果我要使用类似于以下内容的方式更新默认 AuthController@create 方法:

    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. 在 users 表中必须将 email 和 domain_id 设置为唯一以防止重复:UNIQUE INDEX unique_email_domain_id (email, domain_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);
    }
}

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

【问题讨论】:

    标签: php laravel-5 laravel-5.1


    【解决方案1】:

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

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

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

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

    您应该做的只是扩展身份验证功能/过滤器,当用户登录到特定域时,您可以在应用数据/视图/能力之前识别当前路由所在的域

    例如:

    MyController extends Controller
    {
    
           public function view(ViewRepository $view)
        {
    
               return $view->make('path.to.my.view')
         }
    }
    
    
    }
    

    ViewRepository 扩展 View 并根据当前路由域覆盖发送到视图的数据。

    您可以获得超级花哨并传入任何特定于域的存储库文件,该文件充当基于两个域之间更改的任何“核心”功能的接口/过滤器......仅将此方法用于您需要采取行动的事情在扩展您为维护 DRY 原则而开发的核心类的域之间存在差异。

    【讨论】:

    • 感谢您的回复。关于密码你会怎么做,我在你的例子中如何理解如果用户更改密码,这些数据将在所有站点上更新,因为我们有一个用户表。我不希望用户看到系统上域之间的任何链接。
    • 如果您想拥有单独的密码,情况就不同了。每个用户都将被视为单独的实体,您可以无视我的回答吗?
    猜你喜欢
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2015-09-23
    • 2016-05-13
    • 2016-03-24
    相关资源
    最近更新 更多