You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Superset 2.0.0中添加带JWT认证的Flask AppBuilder API端点

在Superset 2.0.0中添加受JWT认证保护的自定义API端点

你的问题出在BaseApi类未实例化就直接注册,Flask Appbuilder的BaseApi必须先实例化才能作为蓝图被Superset加载。下面是完整的正确实现方案:

1. 编写带认证保护的自定义API

创建greeting.py,继承BaseApi后实例化对象,同时指定路由前缀避免和Superset内置接口冲突:

# greeting.py
from flask_appbuilder.api import BaseApi, expose, protect

class GreetingApi(BaseApi):
    # 纯API调用无需CSRF令牌,设置为True
    csrf_exempt = True
    # 自定义API前缀,防止与Superset原有路由冲突
    url_prefix = "/api/v1/custom"

    @protect  # 启用Superset的JWT认证保护
    @expose("/hello", methods=["GET"])
    def greeting(self):
        return self.response(200, message="Hello authenticated user!")

# 必须实例化类,才能作为蓝图注册
greeting_api = GreetingApi()

2. 在Superset配置中注册蓝图

修改superset_config.py,导入实例化后的API对象并添加到BLUEPRINTS列表:

# superset_config.py
from greeting import greeting_api

BLUEPRINTS = [greeting_api]

3. 验证认证效果

  • 先通过Superset内置的/api/v1/security/login接口获取JWT令牌,请求体示例:
    {
      "username": "你的用户名",
      "password": "你的密码",
      "provider": "db"
    }
    
  • 访问自定义端点/api/v1/custom/hello时,在请求头中携带令牌:
    Authorization: Bearer <你的JWT令牌>
  • 若未携带令牌或令牌无效,会返回401 Unauthorized,说明认证保护生效。

关键细节说明

  • @protect装饰器会自动校验请求头中的JWT令牌,仅允许通过Superset登录生成的有效令牌访问。
  • 必须指定url_prefix,否则容易和Superset内置的/api/v1路由产生冲突。
  • 如果API需要处理POST/PUT等请求,需在@expose中明确指定methods参数,同时保持csrf_exempt=True(API场景无需CSRF校验)。

内容的提问来源于stack exchange,提问作者Nicolaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:45:40