如何跳过Superset默认JWT Token认证,接入自定义认证服务?
用自研认证服务保护Superset REST API并跳过默认JWT认证的实现方案
1. 编写自定义认证中间件
创建Python中间件对接自研认证服务,完成请求合法性校验:
from flask import request, g from superset.security import SupersetSecurityManager class CustomAuthMiddleware: def __init__(self, app): self.app = app def __call__(self, environ, start_response): # 从请求头获取自研认证标识(示例为自定义X-Custom-Token) custom_token = request.headers.get('X-Custom-Token') # 调用自研认证服务验证token有效性 is_valid, user_info = self.validate_with_custom_auth(custom_token) if not is_valid: # 验证失败直接返回401 return self.app(environ, start_response) # 验证成功后设置Superset用户上下文 sm = SupersetSecurityManager() user = sm.find_user(username=user_info['username']) if not user: # 按需自动创建Superset用户 user = sm.add_user( username=user_info['username'], email=user_info.get('email'), first_name=user_info.get('first_name'), last_name=user_info.get('last_name'), roles=[sm.find_role('Admin')] # 根据业务需求设置默认角色 ) g.user = user return self.app(environ, start_response) def validate_with_custom_auth(self, token): # 替换为自研认证服务的实际验证逻辑 # 示例:校验token并返回(验证结果, 用户信息) if token == "your_valid_custom_token": return True, {"username": "custom_user", "email": "user@example.com"} return False, {}
2. 修改Superset配置,禁用默认JWT并注册中间件
在superset_config.py中添加以下配置:
# 禁用Superset默认JWT认证 JWT_AUTH_ENABLED = False # 注册自定义认证中间件 from flask import Flask from your_module import CustomAuthMiddleware # 替换为中间件所在的实际模块路径 def apply_custom_auth(app: Flask) -> None: app.wsgi_app = CustomAuthMiddleware(app.wsgi_app) ADDITIONAL_MIDDLEWARE = [apply_custom_auth] # 设置允许访问API的角色(按需调整) REST_API_AUTH_ROLE = "Admin"
3. 自定义安全管理器(可选,深度集成用)
如果需要更深度的认证逻辑定制,可替换默认安全管理器:
from superset.security import SupersetSecurityManager class CustomSecurityManager(SupersetSecurityManager): def auth_user(self, username, password): # 自研认证已完成,直接返回上下文用户 return g.user if hasattr(g, 'user') else None # 在superset_config.py中配置自定义安全管理器 CUSTOM_SECURITY_MANAGER = CustomSecurityManager
4. 功能验证
- 发送API请求时,仅携带自研认证的请求头(如
X-Custom-Token: your_valid_custom_token),无需附加Superset默认JWT Token。 - 验证合法请求可正常访问API,未携带有效自研认证标识的请求返回401未授权。
内容的提问来源于stack exchange,提问作者abhishek Singh
相关产品推荐
相关产品推荐

