簡體   English   中英

如何使用SLIM處理多租戶?

[英]How to handle multi tenancy with SLIM?

我正在使用SLIM編寫API ,該API的目標是創建多租戶結構。 到目前為止,我所做的是:

首先,我創建了一個數據庫,其中包含我的所有客戶(購買了我的軟件),對於每個客戶,我都有一個名為CUSTOMER_TOKEN的字段,該字段表示訪問API的憑據。

基本上,我在這里有兩個軟件:

  • API:從租戶數據庫中讀取數據。
  • 主要應用:使用API​​。

實際上,每個租戶都有一個不同的數據庫,我發現這種方式對我來說是最佳選擇。

主應用程序獲得一個JWT令牌,該令牌通過使用CUSTOMER_TOKENAPI發送請求,例如:

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,第二個數據庫連接用於客戶(租戶)。 您不需要中間件,因為基礎結構配置中的數據庫連接部分位於中間件下方。

您可以使用多個選項來與容器一起管理數據庫連接。

  1. 只需為容器條目添加第二pdo2名,例如pdo2db2或類似的東西對您有意義。
// API
$container['pdo'] = function (Container $container) {
// Customer database
$container['pdo2'] = function (Container $container) {
  1. 我希望您使用構造函數依賴項注入 如果是,則最好使用類或接口名稱定義容器條目。

例:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM