Superset 是apache的一个孵化项目,定位为一款现代的,准商用BI系统

superset

Apache Superset (incubating) is a modern, enterprise-ready business intelligence web application

Superset 是apache的一个孵化项目,定位为一款现代的,准商用BI系统。

Superset(Caravel)是由Airbnb(知名在线房屋短租公司)开源的数据分析与可视化平台(曾用名Caravel、Panoramix),该工具主要特点是可自助分析、自定义仪表盘、分析结果可视化(导出)、用户/角色权限控制,还集成了一个SQL编辑器,可以进行SQL编辑查询等。

通过superset,可以制作漂亮的统计图表。

预览




superset安装

我们这里直接使用docker

  1. git clone https://github.com/apache/incubator-superset/
  2. cd incubator-superset/contrib/docker
  3. # prefix with SUPERSET_LOAD_EXAMPLES=yes to load examples:
  4. docker-compose run --rm superset ./docker-init.sh
  5. # you can run this command everytime you need to start superset now:
  6. docker-compose up

等构建完成后,访问 http://localhost:8088 即可。

想要在自己的应用集成,首先要解决认证

superset 认证分析

superset基于flask-appbuilder开发,security基于flask_appbuilder.security,翻阅其代码,

找到入口: superset/__init__.py:

  1. custom_sm = app.config.get('CUSTOM_SECURITY_MANAGER') or SupersetSecurityManager
  2. if not issubclass(custom_sm, SupersetSecurityManager):
  3. raise Exception(
  4. """Your CUSTOM_SECURITY_MANAGER must now extend SupersetSecurityManager,
  5. not FAB's security manager.
  6. See [4565] in UPDATING.md""")
  7. appbuilder = AppBuilder(
  8. app,
  9. db.session,
  10. base_template='superset/base.html',
  11. indexview=MyIndexView,
  12. security_manager_class=custom_sm,
  13. update_perms=get_update_perms_flag(),
  14. )
  15. security_manager = appbuilder.sm

默认使用SupersetSecurityManager,继承自SecurityManager

  1. class SupersetSecurityManager(SecurityManager):
  2. def get_schema_perm(self, database, schema):
  3. if schema:
  4. return '[{}].[{}]'.format(database, schema)
  5. def can_access(self, permission_name, view_name):
  6. """Protecting from has_access failing from missing perms/view"""
  7. user = g.user
  8. if user.is_anonymous:
  9. return self.is_item_public(permission_name, view_name)
  10. return self._has_view_access(user, permission_name, view_name)
  11. ...

我们再来看SecurityManager及父类,发现,登录是通过auth_view来控制的,默认是AUTH_DB,也就是AuthDBView。


  1. """ Override if you want your own Authentication LDAP view """
  2. authdbview = AuthDBView
  3. if self.auth_type == AUTH_DB:
  4. self.user_view = self.userdbmodelview
  5. self.auth_view = self.authdbview()
  6. @property
  7. def get_url_for_login(self):
  8. return url_for('%s.%s' % (self.sm.auth_view.endpoint, 'login'))

再来看authdbview:

  1. class AuthDBView(AuthView):
  2. login_template = 'appbuilder/general/security/login_db.html'
  3. @expose('/login/', methods=['GET', 'POST'])
  4. def login(self):
  5. if g.user is not None and g.user.is_authenticated:
  6. return redirect(self.appbuilder.get_url_for_index)
  7. form = LoginForm_db()
  8. if form.validate_on_submit():
  9. user = self.appbuilder.sm.auth_user_db(form.username.data, form.password.data)
  10. if not user:
  11. flash(as_unicode(self.invalid_login_message), 'warning')
  12. return redirect(self.appbuilder.get_url_for_login)
  13. login_user(user, remember=False)
  14. return redirect(self.appbuilder.get_url_for_index)
  15. return self.render_template(self.login_template,
  16. title=self.title,
  17. form=form,
  18. appbuilder=self.appbuilder)

对外提供'/login/'接口,读取HTTP POST里的用户名,密码,然后调用auth_user_db验证,验证通过调用login_user生成认证信息。

因此,我们可以自定义AuthDBView,改为从我们自己的应用认证即可。

使用jwt来验证superset

自定义CustomAuthDBView,继承自AuthDBView,登录时可以通过cookie或者url参数传入jwt token,然后验证通过的话,自动登录,。

  1. import jwt
  2. import json
  3. class CustomAuthDBView(AuthDBView):
  4. login_template = 'appbuilder/general/security/login_db.html'
  5. @expose('/login/', methods=['GET', 'POST'])
  6. def login(self):
  7. token = request.args.get('token')
  8. if not token:
  9. token = request.cookies.get('access_token')
  10. if token is not None:
  11. jwt_payload = jwt.decode(token,'secret',algorithms=['RS256'])
  12. user_name = jwt_payload.get("user_name")
  13. user = self.appbuilder.sm.find_user(username=user_name)
  14. if not user:
  15. role_admin = self.appbuilder.sm.find_role('Admin')
  16. user = self.appbuilder.sm.add_user(user_name, user_name, 'aimind', user_name + "@aimind.com", role_admin, password = "aimind" + user_name)
  17. if user:
  18. login_user(user, remember=False)
  19. redirect_url = request.args.get('redirect')
  20. if not redirect_url:
  21. redirect_url = self.appbuilder.get_url_for_index
  22. return redirect(redirect_url)
  23. else:
  24. return super(CustomAuthDBView,self).login()
  25. else:
  26. flash('Unable to auto login', 'warning')
  27. return super(CustomAuthDBView,self).login()

如果用户不存在,通过self.appbuilder.sm.add_user自动添加用户。

然后再引入这个CustomAuthDBView,

  1. class CustomSecurityManager(SupersetSecurityManager):
  2. authdbview = CustomAuthDBView

最后,再引入这个CustomSecurityManager,在superset_config.py 里增加:

  1. from aimind_security import CustomSecurityManager
  2. CUSTOM_SECURITY_MANAGER = CustomSecurityManager

在应用里集成superset

集成就简单了,访问,'SUPER_SET_URL/login/?token=jwt_token' 即可,可以通过iframe无缝集成。


作者:Jadepeng

出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi

您的支持是对博主最大的鼓励,感谢您的认真阅读。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

教程 —— 如何在自己的应用集成superset的更多相关文章

  1. 2017.2.12 开涛shiro教程-第七章-与Web集成

    2017.2.9 开涛shiro教程-第七章-与Web集成(一) 原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. ...

  2. SpringBoot图文教程3—「‘初恋’情结」集成Jsp

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...

  3. 4、ABPZero系列教程之拼多多卖家工具 集成短信发送模块

    ABPZero并没有手机短信发送功能,现在我们来集成一个,为后面注册.登录作铺垫. 阿里云短信服务 首先需要在阿里云开通短信服务,连接地址 开通后,在签名管理中添加一个签名 在模板管理中添加一个模板, ...

  4. (转) SpringBoot非官方教程 | 第十一篇:springboot集成swagger2,构建优雅的Restful API

    swagger,中文“拽”的意思.它是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅,而且还提供了在线文档的测试.另外swagger很容易构建restful风格的api,简单优雅 ...

  5. SpringBoot非官方教程 | 第十三篇:springboot集成spring cache

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot13-springcache/ 本文出自方志朋的博 ...

  6. SpringBoot非官方教程 | 第十一篇:springboot集成swagger2,构建优雅的Restful API

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot-swagger2/ 本文出自方志朋的博客 swa ...

  7. [SpringCloud教程]3. Eureka服务注册中心集成

    新微服务项目多半采用Nacos作为服务注册与发现中心,但是旧项目可能使用Eureka.zookeeper.Consul.Nacos作为服务注册中心. 新项目建议使用Nacos作为服务注册中心 Spri ...

  8. SpringBoot非官方教程 | 第二十一篇: springboot集成JMS

    转载请标明出处: http://blog.csdn.net/forezp/article/details/71024024 本文出自方志朋的博客 springboot对JMS提供了很好的支持,对其做了 ...

  9. Spring Boot系列教程十二:Spring boot集成Redis

    一.创建项目 项目名称为 "springboot_redis",创建过程中勾选 "Web","Redis",第一次创建Maven需要下载依赖 ...

随机推荐

  1. Redis——发布和订阅

    发布与订阅(又称pub/sub),订阅者(listener)负责订阅频道(channel),发送者(publisher)负责向频道发送二进制字符串消息(binary string message).每 ...

  2. 基于RBAC的权限框架

    RBAC权限框架(Role-Based Access Control)基于角色的权限访问控制的框架,通过用户-角色-权限的关联,非常方便的进行权限管理,在这里不再说明什么是RBAC,请自行百度. 谢谢 ...

  3. java swing 开发 -JTable

    最近利用空闲时间自己琢磨了一下java swing 编程,其实在从事javaweb之前我一直向往的就是java swing 开发,不知道为什么可能当时觉得Windows上的exe程序很是神奇,关于wi ...

  4. MySQL-EXPLAIN执行计划字段解释

    做 MySQL 查询优化遇到明明建了索引查询仍然很慢,看这个 SQL 的执行计划,看它到底有没有用到索引,执行的具体情况.我们可以用 EXPLAIN 命令查看 SQL 的执行计划,SQL 优化的重要性 ...

  5. Ubuntu 16.04 安装 SVN-Client (RaabitVCS)

    1.添加源 sudo add-apt-repository ppa:rabbitvcs/ppa 2. 更新源 sudo apt-get update 3.安装依赖库 sudo apt-get inst ...

  6. Shell脚本书写规范

    在日常的运维工作中,Shell脚本肯定是必不可少的工作内容.为方便问题排查.脚本执行历史问题追踪.方便大家共同维护,从网上搜罗结合以往的经验教训拟定以下Bash脚本书写规范.欢迎各位同学指正或补充. ...

  7. 阿里云短信服务(JAVA)

    一,前言 ​ 短信验证码想必大家都不陌生,在很多网站,APP中都有使用到.比如登录,注册,身份校验等场景.不过通常情况下,短信服务都是外包给第三方公司的,接下来向大家分享如何使用阿里的短信服务. 二, ...

  8. 004——Netty之高性能IO(Reactor)

    一.原始方式 方法一: # 使用while循环,不断监听端口是否有新的套接字链接 while(true){ socket = accept(); handle(socket) } # 做法局限:处理效 ...

  9. Gin + Vue全栈开发实战(二)

    尝试地写了第一篇自己学习Go Web框架的感受和入门的文章,发现反响还不错,大家也提出了很多的问题来一起交流.近期也渐渐地出现了很多有关go语言开发的相关文章,包括有在蚂蚁金服的大牛的分享,我也一直有 ...

  10. PHP危险函数总结学习

    1.PHP中代码执行的危险函数 call_user_func() 第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数. 传入call_user_func()的参数不能为引用传递 ...