Vue.js QueryBuilder by Cube.js 按本地值匿名化列

Vue.js QueryBuilder by Cube.js anonymise columns by local value

我有以下场景:一个用户有多个客户端。这些客户根据他们的客户 ID 生成不同的报告(使用过滤器选项很容易)。

有些列需要根据未存储在数据库中的标志和存储在数据库中的值进行匿名化,因此我需要通过 json 查询和“匿名化”传递它它在维度 sql.

遗憾的是,无法通过我正在使用的 Cube.js 提供的 QueryBuilder (Vue.js) 传递参数。

也许您知道实现该目标的方法。

您可以使用 queryTransformer https://cube.dev/docs/multitenancy-setup#user-context-vs-query-transformer

您需要在架构中预定义匿名成员版本,因此它看起来像:

  dimensions: {
    // the actual dimension that can be `anonymized`
    userPhone: {
      sql: 'user_phone',
      type: 'number',
    },
    // `anonymized` version of the actual dimension
    userPhoneAnonymized: {
      sql: `'***'`,
      type: `string`
    },
    // ...
  }   

现在,我们可以在 queryTransformer 中应用一些逻辑,确保只有具有适当权限的用户才能访问秘密字段。

const ANONYMIZED_MEMBERS = ['CubeName.userPhone'];
// ...
queryTransformer: (query, { authInfo }) => {
  const user = authInfo.u;

  if (!user.canAccessSecrets) {
    if (query.dimensions && query.dimensions.length) {
      query.dimensions = query.dimensions.map((memberName) => {
        if (ANONYMIZED_MEMBERS.includes(memberName)) {
          return `${memberName}Anonymized`;
        }

        return memberName;
      });
    }
  }
  
  return query;
}

使用此方法将允许其他 Cube.js 功能(例如 pre-aggregations)正常工作。