簡體   English   中英

CubeJS Multitenant:當用戶使用不同的令牌訪問服務器時,如何使用 COMPILE_CONTEXT?

[英]CubeJS Multitenant: How to use COMPILE_CONTEXT as users access the server with different Tokens?

我們已經開始使用 CubeJS。 我們正在使用 BiqQuery,具有以下層次結構:

  • 項目(所有客戶)
    • 數據集(對應單個客戶端)
      • 表(單個客戶端的不同數據類型)

我們想使用COMPILE_CONTEXT來允許不同的客戶端訪問基於我們在身份驗證后發布的 JWT 的不同數據集。 JWT 包含的用戶信息會導致我們的架構 select 成為不同的數據集:

const {
    securityContext: { dataset_id },
} = COMPILE_CONTEXT;


cube(`Sessions`, {
    sql: `SELECT * FROM ${ dataset_id }.sessions_export`,

    measures: {
        // Count of all session objects
        count: {
            sql: `Status`,
            type: `count`,
        },

在測試中,我們發現 COMPILE_CONTEXT 全局變量是在服務器啟動時設置的,這意味着即使不同的客戶端使用不同的dataset_id向 Cube 提交請求,服務器也會使用舊的,從服務器發送信息舊數據集。 Multi-tenancy state 上的 Cube 文檔 COMPILE_CONTEXT 應該在我們的場景中使用(至少,這是我的理解):

當用戶實際上訪問不同的數據庫時,應該使用多租戶 COMPILE_CONTEXT。 例如,如果您提供 SaaS 電子商務托管,並且您的每個客戶都有一個單獨的數據庫,那么每個電子商務商店都應該建模為一個單獨的租戶。

另一方面,SECURITY_CONTEXT 是在查詢時設置的,因此我們也嘗試從 SECURITY_CONTEXT 訪問適當的數據,如下所示:

cube(`Sessions`, {
    sql: `SELECT * FROM ${SECURITY_CONTEXT.dataset_id}.sessions_export`,

但是發送到數據庫的查詢(在 Cube 開發服務器的錯誤日志中找到)是SELECT * FROM [object Object].sessions_export) AS sessions.

我很想檢查 SECURITY_CONTEXT 變量,但我很難找到如何做到這一點,因為據我所知,它只能在我們的立方體 Sql 中訪問。

任何幫助,將不勝感激。 除上述路線外,我們還開放其他路線,簡而言之? 我們如何使用唯一的 JWT 向客戶端提供特定的數據集?

鑒於您的所有數據集都在同一個 BigQuery 數據庫中,我認為您的用例反映了文檔中具有相同架構的多個數據庫實例部分(該標題肯定可以改進):

// cube.js
const PostgresDriver = require('@cubejs-backend/postgres-driver');

module.exports = {
  contextToAppId: ({ securityContext }) =>
    `CUBEJS_APP_${securityContext.dataset_id}`,
  driverFactory: ({ securityContext }) =>
    new PostgresDriver({
      database: `${securityContext.dataset_id}`,
    }),
};

// schema/Sessions.js
cube(`Sessions`, {
    sql: `SELECT * FROM sessions_export`,
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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