Apache Superset自定义安全管理器登录后无法跳转欢迎页问题
问题原因
自定义登录逻辑无法正常跳转欢迎页,是三个疏漏导致的:
- 仅调用
login_user没有触发Flask-AppBuilder(Superset权限体系底层依赖)的登录后钩子,用户权限上下文、会话登录状态没有完成初始化,权限校验中间件会判定请求未授权,强制打回登录页。 - 没有处理登录重定向的安全校验逻辑,直接返回首页跳转的响应会被FAB内置的开放重定向防护拦截。
- 缺少用户存在性校验,当传入的用户名查不到对应账号时,
login_user传入None会触发运行时异常,直接中断登录流程。
修复方式
调整自定义认证视图的逻辑,补全会话初始化、重定向校验逻辑,修复后的完整代码如下:
from flask import redirect, g, flash, request from superset.security import SupersetSecurityManager from flask_appbuilder.security.views import AuthDBView from flask_appbuilder.security.views import expose from flask_login import login_user from urllib.parse import urlparse, urljoin def is_safe_url(target): # 校验跳转地址为站内地址,避免开放重定向漏洞 ref_url = urlparse(request.host_url) test_url = urlparse(urljoin(request.host_url, target)) return test_url.scheme in ("http", "https") and ref_url.netloc == test_url.netloc class CustomAuthDBView(AuthDBView): @expose("/login/", methods=["GET", "POST"]) def login(self): token = request.args.get("token") if token == "SOME_TOKEN_VALUE": username = request.args.get("username") user = self.appbuilder.sm.find_user(username=username) if not user: flash("自动登录失败:指定用户不存在", "warning") return super().login() # 完成用户登录与会话初始化 login_user(user, remember=False) self.appbuilder.sm.update_user_auth_stat(user) g.user = user # 优先读取next参数跳转,无合法next则跳转首页 next_url = request.args.get("next") if not next_url or not is_safe_url(next_url): next_url = self.appbuilder.get_url_for_index return redirect(next_url) flash("token校验失败,无法自动登录", "warning") return super().login() class CustomSecurityManager(SupersetSecurityManager): authdbview = CustomAuthDBView def __init__(self, appbuilder): super().__init__(appbuilder)
验证步骤
- 替换
custom_security_manager.py文件后,重启Superset服务生效配置 - 清除浏览器本地缓存的Superset Cookie后,可直接用原有测试链接验证,也可以指定跳转地址测试:
http://10.92.123.25:8088/login/?username=admin&token=SOME_TOKEN_VALUE&next=/superset/welcome/
内容的提问来源于stack exchange,提问作者Farrukh Jalil
相关产品推荐
相关产品推荐

