Решения для управления несколькими статическими сайтами с использованием одной базы кода - PullRequest
0 голосов
/ 18 декабря 2018

Так что это общий вопрос об управлении статическими сайтами, которые используют ту же базу кода.Однако есть несколько конфигураций, которые должны быть динамическими в зависимости от пользователя.

Пара предварительных условий

1.Моя кодовая база построена с использованием фреймворка Vue

2.Сайты обмениваются данными с отдельным бэкэндом базы кода через API с уникальной конечной точкой URL

Как взаимодействует API

1. Бэкэнд разработан для мультитенантности, поэтомупо сути, любой запрос пользователя будет зависеть от настроенной конечной точки API.

2. Например, мой axios.baseURL может быть mycompany.domain.com/api/endpoint илиБыть другимcompany.domain.com/api/endpoint в зависимости от того, в какой компании работает пользователь ...

Так что в настоящее время со структурой, которую я построил, я могу разместить свой веб-сайт на aws с s3ведро, или с любым другим решением статического хостинга.Однако мне нужно отдельное ведро для каждого экземпляра веб-сайта компании, и любые изменения, внесенные в базу кода, должны быть перенесены в каждый экземпляр.Ниже приведен список функций, которые я ищу, но которые еще не найденыотдельные конечные точки API для каждого экземпляра корзины

Это что-то, что можно найти в aws или подобных местах, таких как azure?или это то, что я искал полностью за пределами базы?

1 Ответ

0 голосов
/ 18 декабря 2018
  1. Вы должны отделить любую повторно используемую логику, которую можно безопасно применить к каждому веб-сайту, с модулем узла, и вы должны разместить ее самостоятельно.Для представлений / пользовательских функций они должны быть в их собственном хранилище.Вы можете запустить конвейеры на 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');
}
...