Laravel 5中的多租户子域

时间:2016-04-06 19:52:08

标签: php laravel laravel-5

我正在Laravel中构建一个SaaS应用程序,并希望为每个人/公司提供自己的子域名。我有一个users表,其中包含company_id列。我有一个companies表,其中包含sub_domain列,该列将是该公司的子域。我不希望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);
}

2 个答案:

答案 0 :(得分:3)

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

#include <vector>
#include <iostream>

struct StdCardConfirmationReceipt {
private:
    std::string sOfrIdOrderCentral;
public:
    StdCardConfirmationReceipt() : sOfrIdOrderCentral() {}
    StdCardConfirmationReceipt(std::string s) : sOfrIdOrderCentral(s) {}
public:
    const std::string& getsOfrIdOrderCentral() const { return sOfrIdOrderCentral; }
};

int main() {
    std::vector<StdCardConfirmationReceipt> vec;
    vec.push_back(StdCardConfirmationReceipt("1"));
    vec.push_back(StdCardConfirmationReceipt("2"));
    vec.push_back(StdCardConfirmationReceipt("3"));
    for (auto vIter = vec.begin(); vIter != vec.end(); ++vIter) {
        std::cout << vIter->getsOfrIdOrderCentral();
    }
}

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

答案 1 :(得分:0)

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

在会话配置文件中:

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