【问题标题】:Multi-tenant sub-domains in Laravel 5Laravel 5 中的多租户子域
【发布时间】:2016-04-06 19:52:08
【问题描述】:

我正在 Laravel 中构建一个 SaaS 应用程序,并希望为每个人/公司提供自己的子域。我有一个带有 company_id 列的 users 表。我有一个带有sub_domain 列的companies 表,这将是该公司的子域。我不希望 A 公司能够访问 B 公司的子域。

我查看了很多关于如何处理此问题的文章和许多论坛,但我没有找到任何可行的解决方案。我在想我需要将中间件与路由分组结合使用,但我就是想不通。有人有这方面的经验吗?

这是我的routes.php:

Route::group(['domain' => '{sub_domain}.' . env('APP_DOMAIN_NAME'), 'middleware' => 'subdomain'], function() {

    Route::auth();

    Route::group(['middleware' => 'guest'], function () {
        //Route::get('/', 'PublicController@index');
        Route::get('/tickets/create', 'TicketsController@create');
        Route::post('/tickets/create', 'TicketsController@store');
    });

    Route::group(['middleware' => 'auth'], function () {
        Route::get('/tickets', 'TicketsController@index');
        Route::get('/tickets/{id}', 'TicketsController@edit');
        Route::patch('/tickets/{id}', 'TicketsController@update');
        Route::delete('/tickets/{id}', 'TicketsController@destroy');
        Route::get('/my-tickets', 'TicketsController@myTickets');
        Route::get('/tickets/close/{id}', 'TicketsController@closeTicket');

    });
});

这样做的问题是我可以成功访问另一个子域。现在,我仍然只能查看与当前登录用户的公司相关联的工单。我想抛出一个 403,甚至只是重定向回自己的子域。

这里是Subdomain.php 中间件:

public function handle($request, Closure $next)
{
    $request_uri = $request->server('HTTP_HOST');
    $this->checkSubdomainExists($request_uri);

    if(Auth::check()) {
        $user = User::find(Auth::user()->id);
        if($user->company->sub_domain !== Session::get('company_sub_domain')) {
            Session::forget('company_sub_domain');
            return 'not Authed';
        }
    }

    return $next($request);
}

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    这个中间件应该可以工作。

    public function handle($request, Closure $next)
    {
        if(Auth::check()) {
            $user = Auth::user();
            $sub_domain =  array_shift((explode(".",$_SERVER['HTTP_HOST'])));
            if($user->company->sub_domain != $sub_domain) return abort(403);
    
        }
    
        return $next($request);
    }
    

    但要注意,因为如果公司没有登录,它可以看到域。

    【讨论】:

    • 老兄!!!谢谢!所以,现在我需要做的就是为有效的子域和未经身份验证的用户添加检查。
    【解决方案2】:

    Laravel 中的会话可以特定于某个域,因此您可以将此功能与当前子域一起使用。

    在会话配置文件中:

    'domain' => (!empty($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : null,
    

    【讨论】:

      猜你喜欢
      • 2015-10-04
      • 2021-03-07
      • 1970-01-01
      • 2015-12-30
      • 2015-01-13
      • 2020-11-27
      • 1970-01-01
      • 2016-05-31
      • 2021-05-30
      相关资源
      最近更新 更多