1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2026-02-05 21:14:03 +00:00

Add request origin tenant resolver

This commit is contained in:
Jon Erickson 2021-03-22 15:31:33 -07:00
parent 27e9fb4a69
commit 8852a48373
5 changed files with 116 additions and 0 deletions

View file

@ -14,6 +14,7 @@ trait InvalidatesResolverCache
Resolvers\DomainTenantResolver::class, Resolvers\DomainTenantResolver::class,
Resolvers\PathTenantResolver::class, Resolvers\PathTenantResolver::class,
Resolvers\RequestDataTenantResolver::class, Resolvers\RequestDataTenantResolver::class,
Resolvers\RequestOriginTenantResolver::class
]; ];
public static function bootInvalidatesResolverCache() public static function bootInvalidatesResolverCache()

View file

@ -17,6 +17,7 @@ trait InvalidatesTenantsResolverCache
Resolvers\DomainTenantResolver::class, Resolvers\DomainTenantResolver::class,
Resolvers\PathTenantResolver::class, Resolvers\PathTenantResolver::class,
Resolvers\RequestDataTenantResolver::class, Resolvers\RequestDataTenantResolver::class,
Resolvers\RequestOriginTenantResolver::class
]; ];
public static function bootInvalidatesTenantsResolverCache() public static function bootInvalidatesTenantsResolverCache()

View file

@ -0,0 +1,24 @@
<?php
declare(strict_types=1);
namespace Stancl\Tenancy\Exceptions;
use Facade\IgnitionContracts\BaseSolution;
use Facade\IgnitionContracts\ProvidesSolution;
use Facade\IgnitionContracts\Solution;
use Stancl\Tenancy\Contracts\TenantCouldNotBeIdentifiedException;
class TenantCouldNotBeIdentifiedByRequestOriginException extends TenantCouldNotBeIdentifiedException implements ProvidesSolution
{
public function __construct($tenant_id)
{
parent::__construct("Tenant could not be identified by request origin with payload: $tenant_id");
}
public function getSolution(): Solution
{
return BaseSolution::create('Tenant could not be identified with this request origin')
->setSolutionDescription('The request needs to originate from the same domain as the tenant.');
}
}

View file

@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
namespace Stancl\Tenancy\Middleware;
use Closure;
use Illuminate\Http\Request;
use Stancl\Tenancy\Tenancy;
use Stancl\Tenancy\Resolvers\RequestOriginTenantResolver;
class InitializeTenancyByRequestOrigin extends IdentificationMiddleware
{
/** @var callable|null */
public static $onFail;
/** @var Tenancy */
protected $tenancy;
/** @var TenantResolver */
protected $resolver;
public function __construct(Tenancy $tenancy, RequestOriginTenantResolver $resolver)
{
$this->tenancy = $tenancy;
$this->resolver = $resolver;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $this->initializeTenancy($request, $next, $this->getPayload($request));
}
protected function getPayload(Request $request): ?string
{
$tenant = null;
if ($request->hasHeader('origin')) {
$tenant = optional(parse_url($request->headers->get('origin')))['host'];
}
return $tenant;
}
}

View file

@ -0,0 +1,40 @@
<?php
declare(strict_types=1);
namespace Stancl\Tenancy\Resolvers;
use Stancl\Tenancy\Contracts\Tenant;
use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedByRequestOriginException;
class RequestOriginTenantResolver extends Contracts\CachedTenantResolver
{
/** @var bool */
public static $shouldCache = false;
/** @var int */
public static $cacheTTL = 3600; // seconds
/** @var string|null */
public static $cacheStore = null; // default
public function resolveWithoutCache(...$args): Tenant
{
$payload = $args[0];
$domain = config('tenancy.domain_model')::where('domain', $payload)->first();
if ($domain) {
return $domain->tenant;
}
throw new TenantCouldNotBeIdentifiedByRequestOriginException($payload);
}
public function getArgsForTenant(Tenant $tenant): array
{
return [
[$tenant->id],
];
}
}