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