From fa861ed6ddce64c7228234843b449c30456759d2 Mon Sep 17 00:00:00 2001 From: JapSeyz Date: Sun, 15 Mar 2020 21:37:37 +0100 Subject: [PATCH] Added request data identification middleware (#207) * Added request data identification middleware * Fixed styling * Changed to Illuminate request instead of helper * Enabled header and querystring customisation Co-authored-by: Jesper Jacobsen --- assets/config.php | 4 ++ .../InitializeTenancyByRequestData.php | 67 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/Middleware/InitializeTenancyByRequestData.php 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)); + } +}