首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5中的多租户子域

问Laravel 5中的多租户子域
EN

Stack Overflow用户
提问于 2016-04-06 19:52:08
回答 2查看 2.7K关注 0票数 2

我正在建立一个SaaS应用在拉拉维尔,并希望给每个人/公司他们自己的子域名。我有一个带有users列的company_id表。我有一个带有companies列的sub_domain表,它将是该公司的子域。我不希望A公司能够访问B公司的子域名。

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

这是我的routes.php

代码语言:javascript
复制
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中间件:

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-06 20:21:36

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

代码语言:javascript
复制
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);
}

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

票数 3
EN

Stack Overflow用户

发布于 2016-05-23 13:58:58

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

在会话配置文件中:

代码语言:javascript
复制
'domain' => (!empty($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : null,
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36461071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档