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