注意,一下内容来自外网浏览器翻译,本人使用了将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。但是直接在主机系统上运行的超集的核心概念保持不变

解决方案源代码

方法

  • 使用放置在配置目录中的以下 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=trueurl添加参数,可以在没有超集标题(导航栏等)的情况下嵌入仪表板和图表,如下所示:

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 用户集成方案的更多相关文章

  1. SSO集成方案[随笔]

    看这个方案之前,先说明下为什么要加入SSO,以防对大家产生不好的影响.我们产品使用传统winform+db服务+Db存储方式开发,一群老菜帮子开发,以传统的datatble做数据传递,很多年了未有变化 ...

  2. FineReport和泛微OA(Ecology)的单点登录集成方案

    最近出现了很多关于帆软报表和泛微OA的集成问题,均出现在“单点登录”上.直接也有相关的文章介绍一些FineReport和泛微集成的背景.价值等,以及FineReport和OA的深度集成的方案,但是并没 ...

  3. (转)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 ...

  4. 日志服务与SIEM(如Splunk)集成方案实战

    背景信息 目标 本文主要介绍如何让阿里云日志服务与您的SIEM方案(如Splunk)对接, 以便确保阿里云上的所有法规.审计.与其他相关日志能够导入到您的安全运维中心(SOC)中. 名词解释 LOG( ...

  5. TensorFlow神经网络集成方案

    TensorFlow神经网络集成方案 创造张力流create_tensorflow_neuropod 将TensorFlow模型打包为neuropod包. create_tensorflow_neur ...

  6. Oracle数据库——用户、方案的创建与管理

    一.涉及内容 1.掌握用户.方案与权限的基本概念. 2.熟练掌握用户操作的相关命令. 二.具体操作 (一)选择题: 1.关于方案的描述下列哪一项不正确?(C) A.表或索引等对象一定属于某一个方案 B ...

  7. Spring+Struts集成(方案一)

    SSH框架是现在非常流行的框架之一,本文接下来主要来对Spring和Struts的集成进行展示. 集成原理:在Action中取得BeanFactory,通过BeanFactory取得业务逻辑对象. 集 ...

  8. 15.app后端怎么设计用户登录方案

    在很多app中,都需要用户的登录操作.登录,就需要用到用户名和密码.为了安全起见,暴露明文密码的次数越少越好.怎么能最大程度避免泄露用户的密码呢?在登录后,app后端怎么去验证和维持用户的登录状态呢? ...

  9. **15.app后端怎么设计用户登录方案(API权限安全)

    在很多app中,都需要用户的登录操作.登录,就需要用到用户名和密码.为了安全起见,暴露明文密码的次数越少越好.怎么能最大程度避免泄露用户的密码呢?在登录后,app后端怎么去验证和维持用户的登录状态呢? ...

  10. Jmeter+Ant+Jenkins持续集成方案改进

    关于Jmeter+Ant+Jenkins如何搭建持续集成环境,网上资料一大把,就不多说了,本文主要谈一下期间的问题及扩展该持续集成方案. 其实核心的流程不复杂,Jenkins管理构建项目,Ant配置脚 ...

随机推荐

  1. Code::Blocks C语言新手教学

    ## 简介 C语言是一种广泛应用于系统编程和底层开发的编程语言.它是一种结构化的.面向过程的语言,具有高效的性能和灵活的编程风格.在学习C语言时,通常会使用一些集成开发环境(IDE)来编写.编译和运行 ...

  2. Python 潮流周刊#78:async/await 是糟糕的设计(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  3. golang之操作kafka

    安装第三方包: go get github.com/IBM/sarama 生产者实例: package main import ( "fmt" "github.com/I ...

  4. Golang基础库之net/http

    Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. net/http介绍 Go语言内置的net/http包提供了HTTP客户端和服务端的实现. HTTP协议 超文本传输协 ...

  5. Tornado框架之应用安全(四)

    知识点 Cookie操作 安全Cookie 跨站请求伪造原理 XSRF保护 模板 请求体 HTTP报文头 用户验证 authenticated装饰器 get_current_user()方法 logi ...

  6. 震惊!推荐一款AI驱动的自动化测试神器:TestCraft

    在当今快速迭代的软件开发环境中,自动化测试已经成为确保软件质量的重要一环.然而,传统的手动录制和编写测试脚本的方式不仅耗时耗力,还难以跟上敏捷开发的节奏. 本文将为大家介绍一款基于AI技术的自动化测试 ...

  7. 使用Aurora在PPT中插入Latex公式

    应用场景: (1) 在PPT中插入Latex公式 (2) 当点击PPT中的公式,出现提示 "无法找到 服务器应用程序.源文件.和项目,或返回的未知错误.请重新安装服务程序." 的时 ...

  8. Lombok 代码优化器

    Lombok是一种Java实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO).它通过注释实现这一目的 使用安装Lombok pom文件导入lombok Mav ...

  9. 分享一个纯Python开发的系统程序,基于VSCode + WxPython开发的跨平台应用系统

    本项目是基于 wxPython 开发的 GUI 应用,主要用于管理基础框架内容,包括用户.角色.机构.权限.日志.菜单.字典.附件.通用编码规则.配置管理等基础框架内容. 愿景是构建一个基于Pytho ...

  10. fastadmin-表格使用

    1.弹窗页面大小 <div id="toolbar" class="toolbar"> <a data-area='["90%&qu ...