Superset整合keycloak系统

2023-11-18

本篇主要介绍superset如何整合单点登陆系统keycloak,现在网上的博客大部分都是失效了,这里我相当于更新一下,避免大家再走弯路

一、环境配置

Macos

keycloak:18.0.0

superset:2.1.0

keycloak规定:每一个要接入keycloak的三方系统必须要有一个client与之相对应,所以上来就要创建一个,假设名字为superset

最后对client进行配置,主要包括url设置,具体如下:

二、代码配置

这部分内容在网上大部分都是过期的,基于网上的博客,进行部分依赖库的修改,这里是用macos进行开发,环境部署在linux docker容器中,以下是我修改的文件列表:

 下面分别一个一个将代码进行展示出来:

2.1、Makefile

主要增加环境变量,指定PYTHONPATH所在目录,目的是后面增加文件后能找到变量声明

# 环境变量配置,env,在Makefile 开头附近加上就可以
CUR_DIR:=$(shell pwd)
export PYTHONPATH=$(CUR_DIR)/superset

2.2、base.txt & development.txt

在base.txt增加依赖:

Flask-OpenID==1.3.0
flask-oidc-ext==1.4.5

在development.txt修改依赖:

requests==2.26.0 ==> requests==2.28.2

2.3、superset/config.py

修改AUTH_TYPE = AUTH_DB ==> AUTH_TYPE = AUTH_OID

2.4、新增superset/client_secret.json

{
  "web": {
     "issuer": "https://sso.test.com/auth/realms/master",
     "auth_uri":"https://sso.test.com/auth/realms/master/protocol/openid-connect/auth",
     "client_id": "superset",
     "client_secret": "这个key是从keycloak中web界面里面有提供",
     "verify_ssl_server": false,
     "post_logout_redirect_uri": "http://superset.test.com/",
     "userinfo_uri":"https://sso.test.com/auth/realms/master/protocol/openid-connect/userinfo",
     "token_uri":"https://sso.test.com/auth/realms/master/protocol/openid-connect/token",
     "token_introspection_uri":"https://sso.test.com/auth/realms/master/protocol/openid-connect/token/introspect"
    }
}

2.5、新增superset/superset_config.py

import os
from superset.keycloak_sso import OIDCSecurityManager

#---------------------------------------------------------
# Flask App Builder configuration
#---------------------------------------------------------
# Your App secret key,这个地方SECRET_KEY,需要是随机字符串,代表当前superset app
# 此处的key,和上文中client key不一样
SECRET_KEY='IKyZMVz0hz+Uq097CmD22ghww8oxYvot4yFj2dy3'
OIDC_CLIENT_SECRETS = os.path.dirname(os.path.realpath(__file__)) + '/client_secret.json'
OIDC_ID_TOKEN_COOKIE_SECURE = False
OIDC_REQUIRE_VERIFIED_EMAIL = False
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = 'Public'
CUSTOM_SECURITY_MANAGER = OIDCSecurityManager
OVERWRITE_REDIRECT_URI = 'http://superset.test.com/oidc_callback'

2.6、新增superset/keycloak_sso.py

import logging
import json
from flask_appbuilder.security.manager import AUTH_OID
from superset.security import SupersetSecurityManager
from flask_appbuilder.security.views import AuthOIDView
from flask_login import login_user
from urllib.parse import quote
from flask_appbuilder.views import expose
from flask import request, redirect
from flask_oidc_ext import OpenIDConnect
from oauth2client.client import OAuth2Credentials

logger = logging.getLogger(__name__)


class OIDCSecurityManager(SupersetSecurityManager):

    def __init__(self, appbuilder):
        super(OIDCSecurityManager, self).__init__(appbuilder)
        if self.auth_type == AUTH_OID:
            self.oid = OpenIDConnect(self.appbuilder.get_app)
        self.authoidview = AuthOIDCView

class AuthOIDCView(AuthOIDView):
    @expose('/login/', methods=['GET', 'POST'])
    def login(self, flag=True):
        sm = self.appbuilder.sm
        oidc = sm.oid
        superset_roles = ["Admin", "Alpha", "Gamma", "Public", "granter", "sql_lab"]
        default_role = "Gamma"

        @self.appbuilder.sm.oid.require_login
        def handle_login():
            user = sm.auth_user_oid(oidc.user_getfield('email'))

            if user is None:
                info = oidc.user_getinfo(
                    ['preferred_username', 'given_name', 'family_name', 'email', 'roles'])
                roles = [role for role in superset_roles if
                         role in info.get('roles', [])]
                roles += [default_role, ] if not roles else []
                user = sm.add_user(info.get('preferred_username'),
                                   info.get('given_name', ''),
                                   info.get('family_name', ''),
                                   info.get('email'),
                                   [sm.find_role(role) for role in roles])

            login_user(user, remember=False)
            return redirect(self.appbuilder.get_url_for_index)

        return handle_login()

    @expose('/logout/', methods=['GET', 'POST'])
    def logout(self):
        try:
            oidc = self.appbuilder.sm.oid
            info = oidc.user_getinfo(
                ['preferred_username', 'email', 'sub', 'given_name', 'iss'])
            id_token_jwt = OAuth2Credentials.from_json(
                oidc.credentials_store[info.get('sub')]).id_token_jwt
            oidc.logout()
            super(AuthOIDCView, self).logout()
            logoutUri = oidc.client_secrets.get('issuer') + '/protocol/openid-connect/logout'
            post_logout_redirect_uri = oidc.client_secrets.get('post_logout_redirect_uri')
            return redirect(logoutUri + '?id_token_hint=' + id_token_jwt + '&post_logout_redirect_uri=' + \
                        quote(post_logout_redirect_uri))
        except Exception as err:
            msg = repr(err)
            if msg.find("User was not authenticated") != -1:
                return redirect('/login/')
            raise

三、linux docker环境修改

上面介绍的内容是在本地直接运行,如果在docker中需要将superset_config.py文件合并到superset/config.py中,主要原因是环境变量问题。所以总体来说,superset_config.py文件没有用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Superset整合keycloak系统 的相关文章

随机推荐

  • iview on-change用法

    原地址 https segmentfault com q 1010000011589626 iview框架select选择框on change事件如何返回当前选中的值 这是文档中的解释 on change 选中的Option变化时触发 默认
  • C++类与封装实例说明

    众所周知 C 具有三大特性 分别为封装 继承 多态 今天有位同学问到我应该如何去理解 我翻了翻笔记本 找到以前上课时学到的案例来解释 首先 成员函数存在希望公开或不希望公开的属性 这也构成了定义成员函数访问级别的三项 1 public 公开
  • 架构师--IT策略灵魂的创造者

    http blog csdn net aspop archive 2006 01 21 585823 aspx 在比尔 盖茨的众多称谓中 据说他更偏爱 首席软件架构师 同样 在网易创始人丁磊名字前 也有 首席架构师 这样的称谓 对于企业来说
  • IDEA国际化资源Key无法全局重命名的解决方案

    一 前言 最近在开发中使用到了HibernateValidator进行入参校验以及错误消息的国际化支持 大家应该都知道在使用HibernateValidator进行校验的时候 我们只需在需要在校验的变量上添加相应的注解 同时在message
  • Flutter 应用程序更新

    Flutter 应用程序更新 原文 https medium com flutter community in app update the flutter way 2f25e4a02c02 前言 当您推出应用程序的新版本时 您希望您的用户
  • CSS3背景渐变

    我们经常可以看到有些背景色并不是纯色 而是好看的渐变色 css3知我懂我 给我们提供了制作渐变背景色的属性 渐变主要包括线性渐变和径向渐变 接下来逐一介绍用法 1 线性渐变 线性渐变 linear gradients 表示颜色沿着一条直线过
  • 设计模式--原型模式

    原型模式 属于创建型模式 基本原理 又称为克隆模式 拷贝本身对象 可以直接使用语言中的拷贝构造 主要流程 在构建对象的时候实现一个对本身的拷贝函数 特别注意 要有对应的销毁方法 include
  • 集合框架(二)

    集合框架 二 回顾 Collection List Set的特点 Collection 不唯一的 无序的 List 不唯一的 有序 Set 唯一的 无序的 Collection和Collections的区别 Collection是集合的顶级
  • C语言/C++实现栈操作

    一 栈的概念 栈是一种常用的数据结构 它遵循先入后出 Last In First Out LIFO 的原则 栈的操作只在栈的一端进行 该端被称为栈顶 而另一端称为栈底 栈的基本操作包括压栈 入栈 push 和弹栈 出栈 pop 分别用于将元
  • HTTP 常见错误

    HTTP 错误 400 400 请求出错 由于语法格式有误 服务器无法理解此请求 不作修改 客户程序就无法重复此请求 HTTP 错误 401 401 1 未授权 登录失败 此错误表明传输给服务器的证书与登录服务器所需的证书不匹配 请与 We
  • 【Python与机器学习2-1】pandas 基本数据对象及操作

    series 相当于一维数组 要有向量化操作思想 series是类似一维数组的对象 即一个列向量 初始化series 通过列表初始化series 默认数字为索引 ser obj pandas Series list 通过字典初始化serie
  • JSP页面中page指令contentPage/pageEncoding具有什么功能呢?

    转自 JSP页面中page指令contentPage pageEncoding具有什么功能呢 下文将讲述page指令的contentPage及pageEncoding指令的功能简介说明 如下所示 page指令的contentPage及pag
  • Antd DatePicker 设置默认值报clone.weekday is not a function

    代码 dayjs版本1 11 7 页面 当点击页面日期框会报clone weekday is not a function 解决方法 在jsx文件中添加如下js import dayjs from dayjs import advanced
  • AngularJS单元测试环境搭建及验证

    AngularJS的单元测试 要测试AngularJS 需要先搭建相关的测试环境 之前已经安装了Node js并验证了基本的功能 同时下载了AngularJS的包 成功运行了AngularJS编写的程序 也就是说基本的开发环境已经构建完成
  • ArcGIS处理自相交面

    问题 我们在获取一些osm等开源地理数据网站获取数据后 比如建筑物数据 往往需要对数据进行处理后 才可以进行分析 对于面数据 处理面自相交问题是必须操作 如下图 就是自相交的面 解决方案 该问题可以使用ArcGIS轻松解决 新建线要素 选择
  • ARm 移植最新版QT5.12

    转载 https blog csdn net weixin 37771089 article details 84989447 一 准备 ubuntu 12 04 源码 http download qt io archive qt 5 12
  • IDEA使用maven进行多模块项目打包并梳理正确的打包顺序

    maven多模块打包一般相互之间都有互相的依赖关系 如果没有按照正确的依赖关系顺序进行打包就会报错 例如有三个模块web service common 其中web依赖service web和service都依赖common 那么正确的打包顺
  • hsql获取数组中最后一个值的写法

    一 问题抛出 在数据分析中我们有时候会遇到需要取出数组中最后一个值的方法 1 表xxx数据如下图所示 2 现在需要取出字符串最后的 321 和 987 二 方案探讨 1 反转字符串后 使用切割函数切割获取第一个值 然后再反转一下 代码如下
  • Spring Boot starter 启动流程(无废话版)

    如果无产阶级不能发出自己的声音 他们就会被社会遗忘 一 pom xml文件 1 父依赖 其中它主要是依赖一个父项目 主要是管理项目的资源过滤及插件
  • Superset整合keycloak系统

    本篇主要介绍superset如何整合单点登陆系统keycloak 现在网上的博客大部分都是失效了 这里我相当于更新一下 避免大家再走弯路 一 环境配置 Macos keycloak 18 0 0 superset 2 1 0 keycloa