[英]How to handle multi tenancy with SLIM?
我正在使用SLIM編寫API
,該API的目標是創建多租戶結構。 到目前為止,我所做的是:
首先,我創建了一個主數據庫,其中包含我的所有客戶(購買了我的軟件),對於每個客戶,我都有一個名為CUSTOMER_TOKEN
的字段,該字段表示訪問API的憑據。
基本上,我在這里有兩個軟件:
實際上,每個租戶都有一個不同的數據庫,我發現這種方式對我來說是最佳選擇。
主應用程序獲得一個JWT
令牌,該令牌通過使用CUSTOMER_TOKEN
向API
發送請求,例如:
http://xxx.xxx.xxx.xxx/v1/auth/login
上面的路線將檢查主數據庫上是否存在客戶,如果存在,則將返回一個臨時訪問令牌以使用API
(JWT)。
到目前為止一切都很好。 主要問題來了。 實際上,如果用戶擁有JWT
並且CUSTOMER_TOKEN
有效,則API
應該創建與tenant
數據庫而非主數據庫的連接。
目前,為了處理主連接,我使用了SLIM
容器,特別是:
<?php
use Slim\Container;
$container = $app->getContainer();
$container['pdo'] = function (Container $c) {
$db = $c['settings']['db'];
$pdo = new PDO(
"mysql:host=" . $db['host'] . ";dbname=" . $db['dbname'],
$db['user'],
$db['pass']
);
return $pdo;
};
如何從此處創建與租戶數據庫的其他連接? 我應該使用middleware
嗎? 是否應該檢查請求的路由器以了解是否需要主數據庫或租戶數據庫?
請注意,對於每個租戶,我使用一個名稱約定結構,例如:
app_name-tenant-tenant_name
所以我的前綴是app_name-tenant
,然后是tenant_name
。 因此,我只需要從主數據庫獲取customer
的名稱即可組裝連接。
您將如何處理這種情況? 謝謝。
出於安全和實用的原因,我建議使用兩個不同的PDO連接(實例)。 第一個連接用於API(JWT)Auth,第二個數據庫連接用於客戶(租戶)。 您不需要中間件,因為基礎結構配置中的數據庫連接部分位於中間件下方。
您可以使用多個選項來與容器一起管理數據庫連接。
pdo2
名,例如pdo2
或db2
或類似的東西對您有意義。 // API
$container['pdo'] = function (Container $container) {
// Customer database
$container['pdo2'] = function (Container $container) {
例:
class ApiDatabase extends PDO {}
$container[ApiDatabase::class] = function (Container $container) {
class CustomerDatabase extends PDO {}
$container[CustomerDatabase::class] = function (Container $container) {
名稱約定
現在,您已經為客戶建立了第二個數據庫連接,不再需要表前綴,因為在技術上客戶之間已經有了更好的隔離。 為什么? 數據庫事務也完全分開,這對其他客戶數據(和表)沒有影響。 數據庫遷移將更加容易,因為您不必擔心前綴。 現在,您可以為每個客戶部署新版本,而不會影響其他客戶的數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.