【发布时间】: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);
}
【问题讨论】: