本次集成方案经过个人测试,根据前面2个集成方案的资料,撰写,相关说明由于个人知识水平有限不一定理解准确,有错误的地方环境评论区评论;

1、用户集成方式:

  • A系统用户,通过A的某个界面,iframe嵌入
  • superset接到用户信息后,在superset系统中查找用户,如果用户存在,则登录,并形成session,如果用户不存在则新增用户,当然如果用户角色发生变化,则更新用户,并redirect 目标地址
  • 用户建立后,如何实现行权限设置,显示用户授权的数据?我这里通过建立动态查询语句实现。
  • 嵌入后去除嵌入的dashboard的页面头

2、前期准备,参数设置:Superset config配置文件参数,里面的 跨域访问问题 sql中使用参数问题  设置好;

3、具体细节:

  (1)iframe问题:

  测试用的链接地址如下:http://superset.alibaba.com:9001/login/?username=jiamidadao&userrole=public&redirect=http://iframe.alibaba.com:9001/superset/dashboard/11/

  这里会遇到iframe 跟 redirect 后,session丢失问题

这里我个人理解,没有完全理论知识,跨域访问中,使用了iframe会出现session丢失问题,其实也不是丢失,因为iframe框架返回的session,不是iframe嵌入的链接目标网站的session,而是主站(比如A系统,嵌入superet dashboard页面,A系统是主站)的session,所以用户集成的第2部分iframe的superset网站访问后,用户登录成功,返回session是正确返回的,但是当redirect命令到的时候,浏览器执行location重定向,浏览器判断当前系统没有目标网站 http://iframe.alibaba.com:9001/superset/dashboard/11/ 的session(由于登录的session属于主站),所以不会带着前面登录的session,导致登录不成功,又再次返回登录界面,当然如果此时打印g.user会返回匿名用户,所以这里必须解决iframe 的 session 通用性问题:

针对这个问题解决方法如下:A系统即主站系统的域名设置为:main.alibaba.com ; superset系统域名设置为 superset.alibaba.com ;

在superset的配置文件config.py里面设置 SESSION_COOKIE_DOMAIN = ".alibaba.com"

  这样设置后,superset登录环境返回的session就会被浏览器再次调用,iframe的redirect 后session问题解决

  如果你还有其他方式,请留言;

  

  此处衍生下,在开发环节,没有域名做解析,怎么办?

  通过在客户机上设置host 做域名劫持,进而实现:

127.0.0.1 superset.alibaba.com  main.alibaba.com

同时,本机上安装代理服务器,比如Apache Tomcat 8.5 Tomcat8 ,安装后,启动,将下面文件放到根目录,命名为aa.html,

<html>

<head>
<title>dashboard</title>
<style type="text/css">
.dashboard {
width: 100%;
margin: 0 auto;
} .dashboard iframe {
width: 100%;
height: 100%;
margin-top: -150px;
}
</style> </head> <body>
<div class="dashboard">
<div class="superset-legacy-chart-nvd3 superset-legacy-chart-nvd3-dist-bar"> <iframe
src='http://superset.alibaba.com:9001/login/?username=jiamiyonghu&userrole=public&redirect=http://superset.alibaba.com:9001/superset/dashboard/11/'>
</iframe>
</div>
</div>
</body>
<script> </script>
</html>

然后浏览器访问:http://main.alibaba.com:8080/aa.html

当然访问前,必须要superset启动程序要打开,比如启动后监听的端口号为9001,本地运行;

下面解决第2步:

  (2)用户集成代码

 在superset目录下,跟config.py一个目录,新建pthon文件,security1.py

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)

注意,上面代码只实现了简单的查找用户,可以自己再完善下,比如新增,和更新,并且验证密码,同时主站传过来的可以时token加密的,这里做解密等,都在上面代码里面修改;

在config.py文件里面新增两行代码

from security import CustomSecurityManager
CUSTOM_SECURITY_MANAGER = CustomSecurityManager

执行superset init,重启superset系统,权限完成;提醒下,注意第2步中的参数修改问题;

上述security1的代码另外一个参考是

import jwt
import json
class CustomAuthDBView(AuthDBView):
login_template = 'appbuilder/general/security/login_db.html' @expose('/login/', methods=['GET', 'POST'])
def login(self):
token = request.args.get('token')
if not token:
token = request.cookies.get('access_token')
if token is not None:
jwt_payload = jwt.decode(token,'secret',algorithms=['RS256'])
user_name = jwt_payload.get("user_name")
user = self.appbuilder.sm.find_user(username=user_name)
if not user:
role_admin = self.appbuilder.sm.find_role('Admin')
user = self.appbuilder.sm.add_user(user_name, user_name, 'aimind', user_name + "@aimind.com", role_admin, password = "aimind" + user_name)
if user:
login_user(user, remember=False)
redirect_url = request.args.get('redirect')
if not redirect_url:
redirect_url = self.appbuilder.get_url_for_index
return redirect(redirect_url)
else:
return super(CustomAuthDBView,self).login()
else:
flash('Unable to auto login', 'warning')
return super(CustomAuthDBView,self).login()

两个相互参考,后面这个是如果用户不存在,通过self.appbuilder.sm.add_user自动添加用户,但是增加的是admin,可以改为增加public或者其他角色,访问的时候直接访问:http://superset.alibaba.com:9001/login/?token=jwt_token&redirect=http://superset.alibaba.com:9001/superset/dashboard/11/ 即可

(3)实现用户行权限设置,根据用户在主站的授权,显示对应数据

  • A系统数据库建立数据权限验证数据库,数据库内容就是用户名,用户名对应的事实表访问权限关系,举例:如果用户是依据部门和产品线授权,则权限视图如下:
creatview useraccess as
select 用户名,部门,产品线
from V_用户授权表

至于用户授权表怎么形成,自己根据公司业务情况,自己去写视图;

对于dashboard中使用的数据源,在对应的在datasets中,自定义下sql语句,如:

{% if current_userrole() == 'admin' %}
select a.* from sales a
{% else %}
select a.*
from sales a inner join v_用户权限表 b
on a.部门=b.部门 and a.产品线=b.产品线
where b.用户名='{{current_username()}}'
{% endif %}

至于如何自定义参数及都有哪些参数可用,见Superset实现动态SQL查询

(4)去除嵌入的superset的页面头部不需要的信息:

在主站A上,嵌入页面的css里面写入下面代码:

    <style type="text/css">
.dashboard {
width: 100%;
margin: 0 auto;
} .dashboard iframe {
width: 100%;
height: 100%;
margin-top: -150px;
}
</style>

恭喜你,到此为止,用户集成问题,解决完毕

Superset 用户集成完整方案(iframe方式)的更多相关文章

  1. JS调用iframe方式实现Web区域打印页面内容

    1.程序说明 1) 此程序可以实现选择页面中的区域进行打印,以iframe方式进行打印: 2) 与原生态的print() 区别在于,取消打印页面后可以完整保留当前访问页面的内容. 2.代码部分 1) ...

  2. Oracle数据库用户数据完整备份与恢复

    使用PLSQL-Developer工具可以快速便捷地完成Oracle数据库用户.表的备份恢复. Oracle数据库用户数据完整备份与恢复 1. 备份 1.1   PL/SQL->工具->导 ...

  3. Atitit.你这些项目不都是模板吗?不是原创  集成和整合的方式大总结

    Atitit.你这些项目不都是模板吗?不是原创  集成和整合的方式大总结 1.1. 乔布斯的名言:创新即整合(Creativity is just connecting things).1 1.2. ...

  4. webapp用户身份认证方案 JSON WEB TOKEN 实现

    webapp用户身份认证方案 JSON WEB TOKEN 实现Deme示例,Java版 本项目依赖于下面jar包: nimbus-jose-jwt-4.13.1.jar (一款开源的成熟的JSON ...

  5. 26.OpenIdConnect获取用户信息的两种方式

    openId在OAuth基础之上,在下面这红框内拿到Authorization Code之后还可以返回IdToken. IdToken和AccessToken一起返回.IdToken就会包括了用户的信 ...

  6. EasyUI Tabs + Yii2.0实现iframe方式打开页面(解决共用静态文件引入加载的问题)

    在项目实际开发中,有将打开的各个链接页面隔离的需求(防止静态资源起冲突),这个时候常规思路就是使用iframe来实现!但遇到一个比较棘手的问题,当用easyui Tabs打开一个iframe页面时,怎 ...

  7. 解析SparkStreaming和Kafka集成的两种方式

    spark streaming是基于微批处理的流式计算引擎,通常是利用spark core或者spark core与spark sql一起来处理数据.在企业实时处理架构中,通常将spark strea ...

  8. Istio 生产环境用户流量接入方案

    总结Istio 生产环境用户流量接入方案 方案1 Client -> istioGateway域名(微服务) -> VritualService匹配路由并绑定网关 -> Destin ...

  9. Kubernetes 用户流量接入方案

    总结Kubernetes 生产环境用户流量接入方案 方案1 client -> ddos -> waf -> slb 7层域名 -> nginx端口 -> ingress ...

  10. Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化

    Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成--部署方案优化 之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个 ...

随机推荐

  1. linux终端高级玩法详细介绍

    专注于收集整理更多好玩技巧 更改终端命令行颜色 vi /etc/profile PS1='[\[\e[32m\]\u\[\e[0m\]\[\e[35m\]@\[\e[0m\]\[\e[33m\]\h\ ...

  2. Python如何获取request response body

    在Python中,我们可以使用多个库来发送HTTP请求并获取响应体(response body).其中,最常用的库之一是 requests.这个库提供了简单易用的接口来发送HTTP请求,并可以方便地获 ...

  3. ARC121E Directed Tree

    ARC121E Directed Tree 有意思的容斥加树 dp. 思路 \(a_i\) 可以是除去 \(i\) 祖先之外的所有点,考虑 \(a_i\) 的逆排列. 每一个 \(i\) 在正排列里都 ...

  4. .NET +Vue 开发的高级报表工具

    前言 本文介绍一款基于 .NET 6 开发的高级报表工具.该工具支持多种数据源(如数据库.Excel 文件.API 服务等),并具备强大的数据处理和可视化功能.通过内置的集合函数和类 Excel 界面 ...

  5. 从2s优化到0.1s

    前言 分类树查询功能,在各个业务系统中可以说随处可见,特别是在电商系统中. 但就是这样一个简单的分类树查询功能,我们却优化了5次. 到底是怎么回事呢? 背景 我们的网站使用了SpringBoot推荐的 ...

  6. 70 个群都来问我的 AI 日报,是这么做的。

    最近我给 FastGPT 用户交流群里接入了 AI 日报,每天早上 10 点会自动向群里推送 AI 日报,让群里的小伙伴们第一时间了解到昨天 AI 领域都发生了哪些大事. 效果大概是这个样子的: 如果 ...

  7. python SQLAlchemy 查询慢sql

    1.config文件添加如下配置 FLASKY_DB_QUERY_TIMEOUT = 0.1 # 设置sql执行超时时间 0.1s SQLALCHEMY_RECORD_QUERIES = True # ...

  8. [转载]Redis之缓存穿透、缓存击穿、缓存雪崩及其解决方法

    原文地址:https://mp.weixin.qq.com/s?__biz=MzU2MDY0NDQwNQ==&mid=2247483949&idx=1&sn=6c643858d ...

  9. git之常见问题

    1. You are in the middle of a merge -- cannot amend 场景:上一次提交,本次提交与上次修改点是同一个, 覆盖是的提交,产生的错误 解决方案: git ...

  10. Htq-基于Node.js的异步队列

    github: https://github.com/star7th/htq 部分介绍: 先介绍下基本概念. 我们在编写程序时,偶尔会遇到需要用到异步队列的情况.比如说,我发送一万封邮件,如果单纯使用 ...