Superset 用户集成完整方案(iframe方式)
本次集成方案经过个人测试,根据前面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方式)的更多相关文章
- JS调用iframe方式实现Web区域打印页面内容
1.程序说明 1) 此程序可以实现选择页面中的区域进行打印,以iframe方式进行打印: 2) 与原生态的print() 区别在于,取消打印页面后可以完整保留当前访问页面的内容. 2.代码部分 1) ...
- Oracle数据库用户数据完整备份与恢复
使用PLSQL-Developer工具可以快速便捷地完成Oracle数据库用户.表的备份恢复. Oracle数据库用户数据完整备份与恢复 1. 备份 1.1 PL/SQL->工具->导 ...
- Atitit.你这些项目不都是模板吗?不是原创 集成和整合的方式大总结
Atitit.你这些项目不都是模板吗?不是原创 集成和整合的方式大总结 1.1. 乔布斯的名言:创新即整合(Creativity is just connecting things).1 1.2. ...
- webapp用户身份认证方案 JSON WEB TOKEN 实现
webapp用户身份认证方案 JSON WEB TOKEN 实现Deme示例,Java版 本项目依赖于下面jar包: nimbus-jose-jwt-4.13.1.jar (一款开源的成熟的JSON ...
- 26.OpenIdConnect获取用户信息的两种方式
openId在OAuth基础之上,在下面这红框内拿到Authorization Code之后还可以返回IdToken. IdToken和AccessToken一起返回.IdToken就会包括了用户的信 ...
- EasyUI Tabs + Yii2.0实现iframe方式打开页面(解决共用静态文件引入加载的问题)
在项目实际开发中,有将打开的各个链接页面隔离的需求(防止静态资源起冲突),这个时候常规思路就是使用iframe来实现!但遇到一个比较棘手的问题,当用easyui Tabs打开一个iframe页面时,怎 ...
- 解析SparkStreaming和Kafka集成的两种方式
spark streaming是基于微批处理的流式计算引擎,通常是利用spark core或者spark core与spark sql一起来处理数据.在企业实时处理架构中,通常将spark strea ...
- Istio 生产环境用户流量接入方案
总结Istio 生产环境用户流量接入方案 方案1 Client -> istioGateway域名(微服务) -> VritualService匹配路由并绑定网关 -> Destin ...
- Kubernetes 用户流量接入方案
总结Kubernetes 生产环境用户流量接入方案 方案1 client -> ddos -> waf -> slb 7层域名 -> nginx端口 -> ingress ...
- Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化
Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成--部署方案优化 之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个 ...
随机推荐
- 基于常量值提取浅析elf文件结构
Elf(可执行和可链接文件)是一个永远也绕不开的话题,只要我们还在使用安卓手机/linux服务器,我们就需要了解elf的一些方方面面,现在就让我们从一个常量值提取的小需求出发,逐步解析elf文件结构吧 ...
- 🎉TinyVue v3.19.0 正式发布!Tree 组件终于支持虚拟滚动啦!UI 也升级啦,更更符合现代审美~
你好,我是 Kagol,个人公众号:前端开源星球. 我们非常高兴地宣布,2024年10月28日,TinyVue 发布了 v3.19.0 . 本次 3.19.0 版本主要有以下重大变更: 所有组件全面升 ...
- gearman任务分发改进
基于我上次在这里发现的问题,就是一次性投递20个消息,用sleep等待后发现,最后一个任务需要等前面19个都跑完才能执行,所以这里做一下改进. client.php <?php $client ...
- Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 基于antlr的表达式解析器
package formula; import java.util.HashMap; import java.util.List; import java.util.Map; import org.a ...
- golang之context
context 用来解决 goroutine 之间退出通知.元数据传递的功能. context 使用起来非常方便.源码里对外提供了一个创建根节点 context 的函数: func Backgroun ...
- Postgresql之基础
Postgresql: https://www.postgresql.org/ [安装] 删除已经存在的pg: yum remove -y postgresql* && rm -rf ...
- NOIP 备赛:CF 2E 板刷
从 \(2024.11.05\) 之前的比赛排着刷. CF2028 E 这道题主要考察的是手玩能力和转移技巧. 给定一棵树,根为 \(1\).爱丽丝的起点位于某个顶点 \(v\) .她想走出洞口,但不 ...
- 2023 秋季学期 六周集训 Misc方向
by 高鹏鸿.密语 写在前面,记录和交流是一个很好的习惯,建议可以自己先搭建一个博客用于存储自己的做题记录以及方便交流.还有,对于Misc方向,灵活应对十分重要,一定要善用搜索引擎. 还有一点,给大家 ...
- python雪花算法
雪花算法(Snowflake Algorithm)是一种用于生成唯一的ID的算法,它由Twitter开发.其生成的ID在全局范围内是唯一的,适合高并发场景.雪花算法生成的ID通常是一个64位的整数,包 ...