php - Laravel 5 中的 Multi-Tenancy 子域

标签 php laravel laravel-5

我正在 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);
}

最佳答案

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

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

但要注意,由于公司未登录,所以可以看到域名。

关于php - Laravel 5 中的 Multi-Tenancy 子域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36461071/

相关文章:

php - 使用数组输入值的 Laravel 4 表单验证

javascript - 如何使用php从json文件中删除节点

php - wp_register_style 的正确语法?

laravel-5 - 使用 Copy 或 CopyDirectry 的 Webpack mix 版本文件

php - Laravel 在查询 JSONB 列(转换为数组)时是否调用 json_decode 一次或多次?

laravel - 你可以拥有你的 API 并在 Laravel 中使用它吗?

javascript - 表单的 Jquery 表单验证

php - 需要从多个具有动态用户 ID 的表插入产品表

php - 关于使用 laravel 与多个模型/MySQL 表的问题

php - 根据 laravel 中选定的省份获取城市列表