Vue.js QueryBuilder by Cube.js通过本地值对列进行匿名处理

问题描述

我有以下情况:一个用户有多个客户端。这些客户会根据其客户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功能(例如预聚合)正常工作。