diff --git a/assets/config.php b/assets/config.php index 96cf05db..e06a94fc 100644 --- a/assets/config.php +++ b/assets/config.php @@ -95,6 +95,10 @@ return [ 'storage_to_config_map' => [ // Used by the TenantConfig feature // 'paypal_api_key' => 'services.paypal.api_key', ], + 'identification' => [ + 'header' => 'X-Tenant', // Can be anything, but should really start with "X-", + 'query_parameter' => '_tenant' + ], 'home_url' => '/app', 'create_database' => true, 'queue_database_creation' => false, diff --git a/src/Middleware/InitializeTenancyByRequestData.php b/src/Middleware/InitializeTenancyByRequestData.php new file mode 100644 index 00000000..e92cc76d --- /dev/null +++ b/src/Middleware/InitializeTenancyByRequestData.php @@ -0,0 +1,67 @@ +onFail = $onFail ?? function ($e) { + throw $e; + }; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + if ($request->method() !== 'OPTIONS') { + try { + $this->parseTenant($request); + } catch (TenantCouldNotBeIdentifiedException $e) { + ($this->onFail)($e); + } + } + + return $next($request); + } + + protected function parseTenant(Request $request) + { + if (tenancy()->initialized) { + return; + } + + $header = config('tenancy.identification.header'); + $query = config('tenancy.identification.query_parameter'); + + $tenant = null; + if ($request->hasHeader($header)) { + $tenant = $request->header($header); + } elseif ($request->has($query)) { + $tenant = $request->get($query); + } elseif (! in_array($request->getHost(), config('tenancy.exempt_domains', []), true)) { + $tenant = explode('.', $request->getHost())[0]; + } + + if (! $tenant) { + throw new TenantCouldNotBeIdentifiedException($request->getHost()); + } + + tenancy()->initialize(tenancy()->find($tenant)); + } +}