使用相同代码库管理多个静态网站的解决方案

时间:2018-12-18 18:21:44

标签: amazon-web-services azure vue.js hosting

因此,这是有关管理使用相同代码库的静态网站的一般问题。但是,有几项配置需要根据用户情况动态调整。

几个先决条件

1。我的代码库是使用Vue框架构建的

2。这些网站通过具有唯一网址端点的api通过单独的代码库后端进行通信

API如何通信

1。后端被设计为多租户,因此用户发出的任何请求基本上都将取决于配置的api端点。

2。例如,我的axios.baseURL可以是mycompany.domain.com/api/endpoint,也可以是anothercompany.domain.com/api/endpoint,具体取决于用户在哪家公司工作... / strong>

因此,目前使用我已构建的结构,我可以使用s3存储桶或任何其他静态托管解决方案在aws上托管我的网站。但是,对于网站的每个公司实例,我都需要一个单独的存储桶,对代码库所做的任何更改都必须推送到每个实例中。以下是我正在寻找的尚未找到的功能

功能

  1. 桶代码库由类似Github的东西控制
  2. 为每个存储桶实例配置单独的api端点

这是可以在aws或类似地点(例如天蓝色)上找到的东西吗?还是我正在寻找完全脱离基地的东西?

1 个答案:

答案 0 :(得分:0)

  1. 您应该将可以安全地应用于每个网站的所有可重用逻辑分离到节点模块,并应自己托管。对于视图/自定义功能,这些应该在自己的存储库中。您可以在commit上触发管道,以在特定于存储库的基础上自动将持续集成推出到指定服务器。

对于#2,它更复杂。一种简单的方法是,例如,创建一个名为api_users的新表。这将包含3列idtenant_id(或任何您唯一的“租户标识符”)以及tokenexpiry,其中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');
}