因此,这是有关管理使用相同代码库的静态网站的一般问题。但是,有几项配置需要根据用户情况动态调整。
几个先决条件
1。我的代码库是使用Vue框架构建的
2。这些网站通过具有唯一网址端点的api通过单独的代码库后端进行通信
API如何通信
1。后端被设计为多租户,因此用户发出的任何请求基本上都将取决于配置的api端点。
2。例如,我的axios.baseURL可以是mycompany.domain.com/api/endpoint,也可以是anothercompany.domain.com/api/endpoint,具体取决于用户在哪家公司工作... / strong>
因此,目前使用我已构建的结构,我可以使用s3存储桶或任何其他静态托管解决方案在aws上托管我的网站。但是,对于网站的每个公司实例,我都需要一个单独的存储桶,对代码库所做的任何更改都必须推送到每个实例中。以下是我正在寻找的尚未找到的功能
功能
这是可以在aws或类似地点(例如天蓝色)上找到的东西吗?还是我正在寻找完全脱离基地的东西?
答案 0 :(得分:0)
commit
上触发管道,以在特定于存储库的基础上自动将持续集成推出到指定服务器。对于#2,它更复杂。一种简单的方法是,例如,创建一个名为api_users
的新表。这将包含3列id
,tenant_id
(或任何您唯一的“租户标识符”)以及token
和expiry
,其中tenant_id
是FK到您的tenants
表中。令牌应该只是一个唯一的长字符串。
现在,您应该使用任何API要求在前端传递该字符串。像
{
headers: {
'X-Tenant-Token': getTenantToken()
}
}
然后在Laravel中为此创建新的中间件:
php artisan make:middelware TenantValidityMiddleware
在handle
函数中,确定我们需要一些逻辑:
if ($token = request()->headers()->get('X-Tenant-Token')) {
app()->singleton(Tenant::class, function ($app) {
return Tenant::whereHas('api_users', function(Builder $query){
return $query->where('token', $token);
})->firstOrFail();
});
return $next($request);
}
abort(401, 'Unauthorized access');
现在,任何依赖项注入的Tenant $tenant
调用都会自动为该API请求解析您的租户。
此外,您可以通过添加以下内容来确保确实如此:
session(['token' => $token]);
您可以在AppServiceProvider中为容器解析逻辑添加一些安全性:
$this->app->resolving(Tenant::class, function ($tenant, $app) {
if (!$tenant->token === session('token') || auth()->user()->isAdmin()) {
abort(401, 'Unauthorized access');
}
});
这将有助于确保在请求期间不会进行任何伪造。
(租户的令牌属性按以下方式解决:
public function getTokenAttribute()
{
return $this->tokens()->first()->token;
}
当然,您需要定义token
关系:
public function tokens(): HasOne
{
return $this->hasOne(ApiToken::class, 'api_users', 'tenant_id');
}