Superset 用户集成方案
注意,一下内容来自外网浏览器翻译,本人使用了将superset集成进入第三方系统,superset采用自定义身份验证+第三系统iframe嵌入方式,但是这个方式存在一个问题,iframe与redirect结合会导致session丢失问题,目前还没有解决,如果你解决了,还请留言说明,感谢分享,目前有价值的资料比较少;
以下原文链接:https://sairamkrish.medium.com/apache-superset-custom-authentication-and-integrate-with-other-micro-services-8217956273c1
坦率地说,超集的文档是很利米资讯科技教育在这方面。从身份验证集成开始,我们需要花费大量时间来弄清楚自己。我搜索了很多,无论我去哪里(谷歌、stackoverflow、superset github 问题、flask appbuilder github 问题),很多人都会问关于自定义身份验证层的问题。希望这篇文章能节省其他人的时间。
自定义身份验证 - 问题陈述
- Superset 是基于flask-appbuilder 的,它也提供了认证层。Flask appbuilder 提供身份验证方法
- 有时,没有一种身份验证方法适合我们的需求。这就是 Flask appbuilder 对自定义安全性和自定义身份验证的支持派上用场的地方
- 假设我们有一个微服务架构,Superset 在数据可视化方面发挥着作用。但是还有另一个微服务负责用户管理
解决方案
- 让我们实现一个自定义的安全和身份验证层
- 我正在使用超集 docker image。但是直接在主机系统上运行的超集的核心概念保持不变
解决方案源代码
- 具有自定义身份验证的独立超集的源代码(这里可以点击进入GitHub上,看代码,看config文件夹,里面congfig.py及他自己写的security.py文件)
- 与超集集成的django 演示应用程序的源代码
方法
- 使用放置在配置目录中的以下 superset_config.py 和 security.py 运行 superset docker
docker run --detach --name superset -p "8088:8088" -v $(pwd)/config:/etc/superset -v $(pwd)/data:/var/lib/superset amancevice/superset:0.25. 6
#---------------------------------------------------------
# Superset specific config
#---------------------------------------------------------
ROW_LIMIT = 5000 SUPERSET_WEBSERVER_PORT = 8088
#--------------------------------------------------------- #---------------------------------------------------------
# Flask App Builder configuration
#---------------------------------------------------------
# Your App secret key
SECRET_KEY = '\2\1thisismyscretkey\1\2\e\y\y\h' # The SQLAlchemy connection string to your database backend
# This connection defines the path to the database that stores your
# superset metadata (slices, connections, tables, dashboards, ...).
# Note that the connection information to connect to the datasources
# you want to explore are managed directly in the web UI
SQLALCHEMY_DATABASE_URI = 'sqlite:////var/lib/superset/superset.db' # Flask-WTF flag for CSRF
WTF_CSRF_ENABLED = True
# Add endpoints that need to be exempt from CSRF protection
WTF_CSRF_EXEMPT_LIST = []
# A CSRF token that expires in 1 year
WTF_CSRF_TIME_LIMIT = 60 * 60 * 24 * 365 # Set this API key to enable Mapbox visualizations
MAPBOX_API_KEY = ''
ENABLE_PROXY_FIX = True from security import CustomSecurityManager
CUSTOM_SECURITY_MANAGER = CustomSecurityManager
superset_config.py hosted with by GitHub
自定义 suserset_config.py
- 注意,在 superset_config.py 中,我们尝试使用我们自己的实现来初始化 CUSTOM_SECURITY_MANAGER。
- 示例安全管理器如下所示
from flask import redirect, g, flash, request
from flask_appbuilder.security.views import UserDBModelView,AuthDBView
from superset.security import SupersetSecurityManager
from flask_appbuilder.security.views import expose
from flask_appbuilder.security.manager import BaseSecurityManager
from flask_login import login_user, logout_user class CustomAuthDBView(AuthDBView):
login_template = 'appbuilder/general/security/login_db.html' @expose('/login/', methods=['GET', 'POST'])
def login(self):
redirect_url = self.appbuilder.get_url_for_index
if request.args.get('redirect') is not None:
redirect_url = request.args.get('redirect') if request.args.get('username') is not None:
user = self.appbuilder.sm.find_user(username=request.args.get('username'))
login_user(user, remember=False)
return redirect(redirect_url)
elif g.user is not None and g.user.is_authenticated(): #注意经过测试,g.user.is_authenticated()似乎不应当加()
return redirect(redirect_url)
else:
flash('Unable to auto login', 'warning')
return super(CustomAuthDBView,self).login() class CustomSecurityManager(SupersetSecurityManager):
authdbview = CustomAuthDBView
def __init__(self, appbuilder):
super(CustomSecurityManager, self).__init__(appbuilder)
security.py hosted with by GitHub
将用户直接重定向到目标页面(如特定仪表板)
很多时候,将用户重定向到某个特定的仪表板很有用。如果可以通过上述流程处理登录,那么将它们直接带到我们想要的位置会很好。
http://localhost:8088/login?username=admin&redirect=/superset/dashboard/world_health/#上面的url将自动以管理员身份登录,并将用户直接带入world_health仪表板
下一步
- 我们讨论的流程是为了演示自定义安全层的可能性以及如何使其工作。
- 如果我们在请求中传递用户名参数,它将绕过登录并将用户带入内部。
- 我们需要使认证更加严格。在上述流程之上,基于生态系统,我们可以在 CustomSecurity 层中使用 JWT 令牌或其他方式。
Superset 用户仍留在 Superset
- 这种方法并没有根除 superset 的用户管理、授权流程(角色)等,
- 它包含flask appbuilder的用户管理
- 在我们的应用程序中创建用户时,我们需要调用flask公开的REST API以在超集中创建具有相同用户名的等效用户
- 还可以通过 REST API 以编程方式分配超集中的角色。
- 这样 superset 就可以管理它自己的内部流,其他微服务可以轻松地与 superset 集成
- 这也为控制哪些仪表板应该对哪些用户等可见提供了很大的灵活性,符合 superset 的角色管理方式
覆盖 Superset html 模板
有时,需要更改超集的 UI(html 模板)。缩小范围并不难,因为开箱即用,据我所知,Superset 不支持它。
实现它的一种方法是找到超集模板目录的路径并将我们的更改安装为卷
- 在上面的例子中,我们用我们自己的内容覆盖了超集中的 navbar.html
- superset 的路径,虽然我们使用了上面的 docker 图像,但碰巧是
/usr/local/lib/python3.5/dist-package/superset/templates/...
确保这是您的情况下的路径。
version: '3.6' services:
superset:
image: amancevice/superset:0.25.6
ports:
- "8088:8088"
volumes:
- ./superset-conf/config:/etc/superset
- ./superset-conf/templates/appbuilder/navbar.html:/usr/local/lib/python3.5/dist-packages/superset/templates/appbuilder/navbar.html
- ./superset-conf/data:/var/lib/superset
docker-compose.yml hosted with by GitHub
公共仪表板
这不适用于生产。它用于实验或进行概念验证。
#superset_config.py
PUBLIC_ROLE_LIKE_GAMMA = True
在此之后,我们需要重新运行 init 用户(如果已经运行)
> docker-compose exec superset superset-init
通过向standalone=true
url添加参数,可以在没有超集标题(导航栏等)的情况下嵌入仪表板和图表,如下所示:
http://localhost:9000/superset/dashboard/world_health/?standalone=true
我们需要向 public 角色授予数据库源权限才能使数据可见。
运行在 NGINX 后面的问题
在花了太多时间想办法让 Superset 在 NGINX 后面工作后,发现:
- Superset 使用多个静态文件引用(/static/.../...js & css)而不采用基本 url 约定
- Superset 仅在加载到根路径 (
/
)时才有效 - Superset 支持
url_for
配置baseUrl 的方式。但这仅在后端 python 层上实现得很好。它在前端(Javascript)层没有很好地实现。在某些领域,他们会执行以下操作,但会中断:
// 从flask appbuilder api 端点构建数据表
let url = '/' + modelView.toLowerCase() + '/api/read';
Superset 用户集成方案的更多相关文章
- SSO集成方案[随笔]
看这个方案之前,先说明下为什么要加入SSO,以防对大家产生不好的影响.我们产品使用传统winform+db服务+Db存储方式开发,一群老菜帮子开发,以传统的datatble做数据传递,很多年了未有变化 ...
- FineReport和泛微OA(Ecology)的单点登录集成方案
最近出现了很多关于帆软报表和泛微OA的集成问题,均出现在“单点登录”上.直接也有相关的文章介绍一些FineReport和泛微集成的背景.价值等,以及FineReport和OA的深度集成的方案,但是并没 ...
- (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案二
http://blog.csdn.net/yerenyuan_pku/article/details/52894958 前面我们已经集成了Spring4.2.5+Hibernate4.3.11+Str ...
- 日志服务与SIEM(如Splunk)集成方案实战
背景信息 目标 本文主要介绍如何让阿里云日志服务与您的SIEM方案(如Splunk)对接, 以便确保阿里云上的所有法规.审计.与其他相关日志能够导入到您的安全运维中心(SOC)中. 名词解释 LOG( ...
- TensorFlow神经网络集成方案
TensorFlow神经网络集成方案 创造张力流create_tensorflow_neuropod 将TensorFlow模型打包为neuropod包. create_tensorflow_neur ...
- Oracle数据库——用户、方案的创建与管理
一.涉及内容 1.掌握用户.方案与权限的基本概念. 2.熟练掌握用户操作的相关命令. 二.具体操作 (一)选择题: 1.关于方案的描述下列哪一项不正确?(C) A.表或索引等对象一定属于某一个方案 B ...
- Spring+Struts集成(方案一)
SSH框架是现在非常流行的框架之一,本文接下来主要来对Spring和Struts的集成进行展示. 集成原理:在Action中取得BeanFactory,通过BeanFactory取得业务逻辑对象. 集 ...
- 15.app后端怎么设计用户登录方案
在很多app中,都需要用户的登录操作.登录,就需要用到用户名和密码.为了安全起见,暴露明文密码的次数越少越好.怎么能最大程度避免泄露用户的密码呢?在登录后,app后端怎么去验证和维持用户的登录状态呢? ...
- **15.app后端怎么设计用户登录方案(API权限安全)
在很多app中,都需要用户的登录操作.登录,就需要用到用户名和密码.为了安全起见,暴露明文密码的次数越少越好.怎么能最大程度避免泄露用户的密码呢?在登录后,app后端怎么去验证和维持用户的登录状态呢? ...
- Jmeter+Ant+Jenkins持续集成方案改进
关于Jmeter+Ant+Jenkins如何搭建持续集成环境,网上资料一大把,就不多说了,本文主要谈一下期间的问题及扩展该持续集成方案. 其实核心的流程不复杂,Jenkins管理构建项目,Ant配置脚 ...
随机推荐
- 基于RDK X5的智慧交通监控系统
· 本Blogs同步发表至CSDN:https://blog.csdn.net/xiongqi123123/article/details/143840675?sharetype=blogdetail ...
- 卸载php8后导致php7.4不能被apache解析了
今天突然发现web页面不能解析了,直接返回php代码了,想起来可能是由于不小心更新过apt 源,有一次安装了php8,后来又卸载,导致的,查了一下,发现是libapache2-mod-php没安装. ...
- Redis之客户端工具RedisInsight
RedisInsight简介 RedisInsight是Redis官方出品的可视化管理工具,可用于设计.开发.优化你的Redis应用.支持深色和浅色两种主题,界面非常炫酷!可支持String.Hash ...
- 进程管理工具之supervisor(完整版)*
Supervisor 介绍 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.它是通过fork/ex ...
- 2023-05 多校联合训练 ZJNU站 热身赛
猫猫接币币 给定两个容量分别为a和b的盒子,已知第i秒天上会掉下i个金币,你会从第1秒开始接金币,每秒钟你可以选择任意一个盒子接金币,但是不能不选,你必须使得两个盒子刚好装满,请问是否存在某个时刻,使 ...
- ELASTICSEARCH 读写性能优化
ELASTIC 写i性能优化 refresh translog flush refresh 优化 translog优化 flush 优化 读性能优化 shard 设置
- Coqui TTS合成语音
工具介绍 Coqui TTS是一个用于语音转文本的高性能深度学习模型库.提供1100种语言的预训练模型,提供训练新模型和微调已有模型的工具,提供数据集分析工具.XTTS-v2版本支持16种语言: En ...
- iOS自动化打包输出工具
自动化打包输出工具 做开发的小伙伴有时候会接到自动化打包的需求,公司一般是要求根据一个配置文件来实现自动化配置iOS项目,比如往Xcode工程添加或修改代码.添加Framework.library.S ...
- uni-app 横竖屏问题
前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni-app 坑位 最近有用户反馈闪屏页也叫 ...
- ChatGPT生成测试用例的最佳实践(三)
还记得在第1章,我们利用ChatGPT生成的业务用例吗?这种业务用例生成方式其实和场景法用例设计十分相似,我们是不是也可以直接将业务用例输入ChatGPT,让它输出测试用例呢?笔者输入相关提示词让其补 ...