返回

Superset仪表盘多供应商自定义过滤方案 | 数据隔离实践

vue.js

Superset供应商仪表盘自定义过滤方案

Superset仪表盘在多供应商场景下进行数据隔离,往往需要实现自定义的过滤逻辑。直接使用Superset的原生过滤功能可能无法满足按用户动态展示数据的需求,本篇文章探讨中间层方案,实现用户权限与过滤规则的映射,最终在前端应用消费。

问题分析

Superset提供的原生过滤器通常作用于整个仪表盘,缺乏细粒度的用户级别数据隔离能力。当存在多个供应商且各自数据互不相关时,直接通过一个统一的仪表盘并仅应用用户ID过滤,可能出现:

  • 数据泄露风险:错误的用户权限配置导致可以看到其他供应商的数据。
  • 用户体验差:需要在众多不相干的数据中筛选。
  • 维护成本高:当供应商数量变动时,过滤器配置的修改变得繁琐。

为了解决这些问题,可以考虑通过一个中间层来管理用户的权限和对应的仪表盘过滤条件。前端应用从该中间层获取信息后,才能构建适合当前用户的仪表盘。

解决方案一:基于RESTful API的数据映射服务

一个RESTful API可以存储用户、其对应的Superset仪表盘过滤参数(如JSON对象形式),并将它们映射起来。 前端应用发起请求获取特定用户的过滤信息,并将这些信息用于渲染相应的仪表盘。

步骤:

  1. 创建API: 使用例如Python的Flask框架或者Node.js的Express框架创建一个API服务。这个API需要能够:
    • 存储和查询用户、以及与之关联的过滤参数。 可以使用关系数据库或NoSQL数据库来实现。
    • 提供一个用于获取当前用户过滤参数的端点。
  2. Superset数据配置: 将Superset仪表盘的数据源配置成支持过滤的形式, 例如可以在SQL中使用WHERE子句,接受来自API传入的参数。
  3. 前端整合: 在Vue.js应用中,用户登录后,调用API获取其过滤配置,并用这个配置动态设置Superset仪表盘的URL或者参数。
  4. 动态更新: 基于后端配置变化,可以灵活调整每个用户的可见数据。

代码示例(Python Flask):

from flask import Flask, request, jsonify

app = Flask(__name__)

user_filters = {
    'supplier1': {'supplier_id': 1, 'region': 'North'},
    'supplier2': {'supplier_id': 2, 'region': 'South'}
    # 实际数据可存储在数据库中
}

@app.route('/user/filter', methods=['GET'])
def get_user_filter():
    username = request.args.get('username')
    if username in user_filters:
       return jsonify(user_filters[username])
    return jsonify({'message':'User Not Found'}), 404
if __name__ == '__main__':
    app.run(debug=True, port=5001) # 建议配置port参数

操作步骤:

  1. 保存上述代码为 app.py 文件。
  2. 在终端运行: python app.py, 确保环境安装 Flask(pip install Flask
  3. 部署此API到可访问的服务环境。
  4. Vue前端在用户登录后,调用GET请求,例如 http://<api-host>:5001/user/filter?username=supplier1 ,解析返回的JSON格式参数,动态修改iframe地址或查询条件。

解决方案二: 基于配置文件的规则引擎

如果供应商数量不大,且数据过滤规则较为固定,可使用简单的配置文件(如JSON)来定义用户与其对应的过滤器规则。前端应用在用户登录后,读取这个配置文件,并基于配置渲染相应的仪表盘。

步骤:

  1. 配置文件: 创建一个JSON文件或者类似的配置文件,以映射用户及其对应的过滤器设置。
  2. 规则引擎读取: 前端Vue.js应用中,实现一个函数读取并解析配置文件。
  3. 应用规则: 基于用户的ID,使用规则引擎读取相应的过滤配置,并且利用它动态生成查询语句。

代码示例(JSON):

{
  "supplier1": {
     "filter_query":"supplier_id = 1 AND region='North'",
    "dashboard_id":"dashboard_id_123"
   },
   "supplier2":{
     "filter_query":"supplier_id= 2 AND region = 'South'",
     "dashboard_id":"dashboard_id_456"
   }
  # 更多配置
}

操作步骤:

  1. 创建如上述结构的json文件, 例如user_rules.json , 可以将其放在Web应用的assets目录下或者后端可访问的位置。
  2. 前端代码请求该json文件并进行解析,基于返回结果, 设置 iframe 或者参数。
  3. Vue 应用可以在 mounted 或其他适当的生命周期钩子中发起 fetch('/user_rules.json') 的请求来加载该文件, 然后在每次渲染仪表盘时读取规则文件.

安全性建议

  • 敏感过滤信息, 例如用户密码等,不要明文存储在客户端配置或者代码里。
  • 如果数据敏感,使用HTTPS加密数据传输。
  • 服务端需要进行输入验证和权限控制。
  • 配置文件,可以部署在独立的服务器上并进行访问控制。
  • 使用加密数据库存储用户信息及规则。
  • 防止跨站脚本攻击(XSS),在显示或使用用户提交数据时进行适当的编码和转义。
  • 定期更新和测试安全配置,确保漏洞被及时修复。

总结

在Superset实现用户级的仪表盘过滤,需借助中间层来管理用户、过滤规则的映射关系,然后前端应用程序按需消费。可以根据具体场景,选择合适的解决方案,上述方案提供了两种思路,根据实际情况选择最佳方式。