[英]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.