发布时间:2026/7/24 19:49:27
Apache Superset 二次开发实践:接入 AI Agent,并确保数据权限不被绕过 本文记录澈析 BIChexi BI的开发实践。项目基于 Apache Superset 深度开发增加了 AI Agent、MCP 工具服务、用户权限隔离和独立部署能力。澈析 BI 是独立产品并非 Apache Software Foundation 官方发行版本。一、为什么选择 Superset 做 AI BI传统 BI 的主要操作包括连接数据源、编写 SQL、创建数据集、制作图表和搭建仪表盘。Apache Superset 已经提供了比较完整的数据可视化、SQL Lab、RBAC 和行级权限能力适合作为智能 BI 的基础平台。但接入大模型后问题不只是“让 AI 生成 SQL”。真正需要解决的是AI 能看到哪些数据库和数据集AI 创建的图表属于哪个用户不同角色能否通过 Agent 绕过页面权限自然语言查询是否遵守行级安全规则AI 生成错误 SQL 时如何限制影响范围因此我们没有让 Agent 直接连接业务数据库而是让它通过 Superset 的业务层和权限体系访问资源。二、整体架构浏览器 │ ├── www.chexi.tech公开产品官网 │ └── app.chexi.tech登录后的 Superset 应用 │ Nginx / HTTPS │ Gunicorn Superset │ ┌──────────────┴──────────────┐ │ │ PostgreSQL 元数据库 Redis 缓存 │ └──────── MCP Service ─────── AI AgentMCP 服务作为独立进程运行使用 FastMCP 提供标准化工具但复用 Superset 的配置、元数据库、SQLAlchemy 模型和安全管理器。目前工具覆盖数据集、数据库、图表、仪表盘等资源例如list_datasets 查询用户可见的数据集 query_dataset 查询已授权数据集 generate_chart 创建图表 get_chart_data 获取图表数据 generate_dashboard 创建仪表盘 list_dashboards 查询可见仪表盘三、最重要的原则AI 不能拥有额外权限Agent 发起请求后服务首先验证 JWT 或其他受支持的令牌再将对应 Superset 用户写入当前请求上下文。简化后的流程如下def handle_agent_request(token: str): user verify_token_and_resolve_user(token) if not user or not user.is_active: raise AuthenticationError() g.user user return execute_tool_as_current_user()之后继续使用 Superset 原有的安全能力Flask-AppBuilder RBAC 控制功能权限DashboardAccessFilter过滤看板ChartAccessFilter过滤图表DatasourceFilter过滤数据集security_manager.raise_for_access()校验具体数据资源数据集查询路径继续应用 Row Level Security这意味着 Agent 只是用户的新操作入口不是一个拥有管理员权限的超级账号。需要特别注意数据集 RLS 与任意 SQL 执行不是同一层安全边界。拥有 SQL Lab 或数据库访问权限的用户可能具备比数据集查询更大的访问范围。因此生产环境应限制任意 SQL 工具并优先让 Agent 使用数据集查询接口。四、开发认证与生产认证必须分开开发阶段可以配置固定用户方便调试MCP_DEV_USERNAME admin但这种模式下所有 MCP 请求都会以同一个用户执行绝对不能直接用于多用户生产环境。生产环境应启用 JWT并校验签名、签发者、受众和过期时间MCP_AUTH_ENABLED True MCP_JWT_ISSUER https://auth.example.com MCP_JWT_AUDIENCE superset-mcp MCP_JWT_ALGORITHM RS256 MCP_JWKS_URI https://auth.example.com/.well-known/jwks.json MCP_DEV_USERNAME None令牌应使用短有效期并将用户身份映射到真实的 Superset 用户。自动化任务则使用独立服务账号授予最小权限而不是复用 Admin。五、Redis 缓存配置中的真实问题图表查询会访问DATA_CACHE_CONFIG。即使业务数据库测试连接成功只要 Redis 认证失败图表接口仍会返回 500。我们曾遇到过这个错误redis.exceptions.AuthenticationError: invalid username-password pair or user is disabled最终发现部署环境中的 Redis 密码包含了额外引号。推荐统一使用环境变量并正确编码连接信息import os from urllib.parse import quote REDIS_HOST os.getenv(REDIS_HOST, 127.0.0.1) REDIS_PORT int(os.getenv(REDIS_PORT, 6379)) REDIS_USER os.getenv(REDIS_USERNAME, default) REDIS_PASSWORD os.environ[REDIS_PASSWORD] password quote(REDIS_PASSWORD, safe) redis_url ( fredis://{REDIS_USER}:{password} f{REDIS_HOST}:{REDIS_PORT}/2 ) DATA_CACHE_CONFIG { CACHE_TYPE: RedisCache, CACHE_KEY_PREFIX: superset_data_, CACHE_REDIS_URL: redis_url, }密钥、数据库密码和 Redis 密码都不应写进superset/config.py更不能提交到 Git。Superset 官方的生产安全文档也明确建议使用环境变量或密钥管理服务而不是在配置文件中硬编码。Superset 生产安全文档六、FastMCP 的模块遮蔽问题另一个比较隐蔽的问题发生在以下启动方式cd /home/ubuntu/prod/ai_superset python superset/app.pyPython 会把脚本所在的superset/目录放到模块搜索路径最前面。Superset 自己存在superset/key_value/它可能遮蔽 FastMCP 依赖的第三方key_value.aio最终出现ModuleNotFoundError: No module named key_value.aio FastMCP server support is not installed依赖实际上已经安装问题出在模块搜索顺序。正确方式是从项目根目录按模块或 WSGI 应用启动python -m superset.app生产环境则使用gunicorn \ --bind 127.0.0.1:9000 \ --workers 2 \ --worker-class gthread \ --threads 8 \ --timeout 300 \ superset.app:create_app()Superset 官方同样不建议在生产环境使用superset run或 Flask 开发服务器而应使用 Gunicorn 等 WSGI 服务。Superset 配置文档七、Nginx 与登录保护Gunicorn 只监听本机地址location / { proxy_pass http://127.0.0.1:9000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }公开官网和数据应用使用不同域名。官网允许搜索引擎抓取Superset 应用则保持登录保护并增加add_header X-Robots-Tag noindex, nofollow, noarchive always;robots.txt和noindex只能控制搜索展示不能代替鉴权。真正的保护仍然是登录状态、RBAC、资源权限、RLS 和接口层的401/403响应。八、AI BI 的能力边界AI Agent 可以降低查询、筛选和可视化配置的操作成本但不能自动理解企业所有业务口径。例如“销售额”可能代表含税金额、实收金额、订单金额或退款后的净额。即使 SQL 语法完全正确指标定义仍可能错误。因此我们把 AI 的定位设计为帮助用户表达分析需求查找用户有权限的数据集生成候选分析和可视化保留查询与图表配置供用户检查让重要结论经过人工核验权限控制决定“能不能访问”业务语义决定“分析得对不对”两者缺一不可。九、总结将 Superset 改造成 AI BI最难的部分不是调用大模型而是让 AI 完整继承现有的数据权限、资源权限和审计边界。这次实践中最关键的经验是Agent 不应直接连接业务数据库。每次工具调用都必须绑定真实用户身份。数据集、图表和仪表盘必须执行对象级权限检查。开发固定用户不能带到生产环境。Redis、JWT、数据库凭据必须使用环境变量或密钥服务。AI 输出必须保留可验证的 SQL、数据口径和图表配置。公开官网与登录后的数据应用必须分离。澈析 BI 目前提供智能数据分析、图表与仪表盘、AI Agent 和权限隔离能力。产品介绍与免费试用地址澈析 BI - 免费试用的智能 BI 与 AI 数据分析工具推荐标签Apache Superset、BI、AI Agent、MCP、数据可视化、 数据权限、Row Level Security、Python、Flask、Gunicorn

相关新闻

2026/7/24 19:49:27

企业级AI数字员工解决方案:安全部署与业务融合实践

1. 项目概述:企业级数字员工解决方案在数字化转型浪潮中,企业正面临一个关键命题:如何让AI技术真正融入业务流程,而非停留在演示阶段。BeeWorks与OpenClaw的组合方案,就像为企业打造了一个可控的"数字水产养殖场&…

2026/7/24 19:49:27

毛豆目标检测数据集:YOLO模型训练与农业应用实战

1. 项目背景与核心价值毛豆作为重要的经济作物,其生长过程中的嫩芽识别和成熟度判断直接影响采收效率和品质控制。传统农业依赖人工目视检查,存在效率低、主观性强、成本高等问题。我们团队开发的"毛豆目标检测数据集"正是为解决这一痛点而生&…

2026/7/24 19:49:27

AM5718 MMC1接口时序深度解析:从SDR25到SDR104的配置与调试实践

1. 项目概述与核心价值在嵌入式系统开发中,尤其是涉及到高速存储接口的设计,时序分析往往是一个既关键又容易被忽视的环节。很多工程师拿到芯片手册,看到那一堆以“SDR25”、“SDR104”命名的时序参数表格时,第一反应可能是头大&a…

2026/7/24 22:35:02

临床预测+医学RAG=结构化EHR建模能力+医学大模型应用能力(六)

第八篇 医学预测模型的全面评估 8.1 区分度指标:AUROC, AUPRC, C-statistic 8.1.1 为什么 AUC 不是全部 在第六篇中,我们用 AUROC 作为模型性能的标尺,顺利筛选出了最优的 LightGBM 模型。但如果你读过医学预测建模的规范论文,会发现往往同时报告四五种指标,单凭一个 A…

2026/7/24 22:35:02

嵌入式通信外设时序配置:从CAN、I2C到McBSP-SPI的实战解析

1. 通信外设时序:嵌入式系统稳定性的基石在嵌入式系统开发,尤其是工业控制、汽车电子和高端数字电源这类对实时性与可靠性要求极高的领域,我们常常把目光聚焦在算法优化、控制精度和功能实现上。然而,一个容易被忽视却至关重要的环…

2026/7/24 22:30:02

系统学习ROS第二章 :ROS通讯机制

机器人是一种高度复杂的通讯机制,在机器人上可以继承多种传感器。例如,雷达、相机 GPS等。为了解耦合,在ROS中每一个功能点都是一个单独的进程,每一个进程都是独立运行的。ROS进程是分布式的框架,这些进行还可以分布于…

2026/7/23 12:54:51

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/24 0:03:10

不同品牌斜齿行星减速机如何替换?以PX与PAG系列为例

不同品牌斜齿行星减速机如何替换?以 PX 与 PAG 系列为例 一、系列对应不等于型号直接互换 PX 与 PAG 都属于斜齿、方法兰、输出轴式精密行星减速机,结构形式和应用方向具有对应关系。 原设备使用PX系列时,可以优先从PAG系列中寻找替换型号。但…

2026/7/24 0:03:10

jdk8 把list 扁平化成String 多个以逗号分隔

在 JDK 8 中&#xff0c;将 List 扁平化为以逗号分隔的 String&#xff0c;有几种非常简洁且高效的方法。&#x1f680; 推荐方案&#xff1a;使用 Collectors.joining()这是最标准的 Java 8 写法&#xff0c;适用于 List<String>。javaimport java.util.stream.Collecto…

2026/7/24 0:03:10

java 两个 long id 怎么合并成一个long id 并且不重复

“把两个 Long ID 合并成一个唯一的 Long ID&#xff0c;且保证不重复”这个需求&#xff0c;在 Java 里直接做数学上的“完美合并”是不可能的。因为两个 Long&#xff08;各 64 位&#xff09;要合并成一个 Long&#xff08;64 位&#xff09;&#xff0c;在信息论上是有损压…

2026/7/23 23:42:43

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…