Superset 配置飞书 OAuth2 登录

背景

  • 简化登录流程:用户只需使用飞书账号登录,无需再记住 Superset 的单独账号和密码,实现 "一处登录,处处通行"。对于企业内部使用 Superset 的员工来说,大大方便了他们的操作,提高了工作效率。
  • 增强安全性:OAuth2 协议采用了安全的授权流程,通过令牌来验证用户身份和授权访问权限,避免了用户密码在网络传输过程中被窃取的风险。同时,飞书作为专业的企业办公平台,拥有完善的安全机制和防护措施,能够为 Superset 的登录认证提供更高的安全性保障。

实现

修改配置

config.py

python 复制代码
from flask_appbuilder.security.manager import AUTH_OAUTH
from custom_sso_security_manager import CustomSsoSecurityManager
AUTH_TYPE = AUTH_OAUTH
OAUTH_PROVIDERS = [
    {
        "name": "lark",
        "token_key": "access_token",  # Name of the token in the response of access_token_url
        "icon": "fa-dove",  # Icon for the provider
        "remote_app": {
            "client_id": "<| CV_SUPER_LARK_CLIENT_ID |>",  # Client Id (Identify Superset application)
            "client_secret": "<| CV_SUPER_LARK_CLIENT_SECRET |>",  # Secret for this Client Id (Identify Superset application)
            "access_token_method": "POST",  # HTTP Method to call access_token_url
            "api_base_url": "https://open.feishu.cn/open-apis/authen/v1/",
            "access_token_url": "https://open.feishu.cn/open-apis/authen/v2/oauth/token",
            "authorize_url": "https://accounts.feishu.cn/open-apis/authen/v1/authorize",
        },
    }
]
# Map Authlib roles to superset roles
AUTH_ROLE_ADMIN = 'Admin'
AUTH_ROLE_PUBLIC = 'Public'
# Will allow user self registration, allowing to create Flask users from Authorized User
AUTH_USER_REGISTRATION = True
# The default user self registration role
AUTH_USER_REGISTRATION_ROLE = "Gamma"
CUSTOM_SECURITY_MANAGER = CustomSsoSecurityManager

如果需要使用 mysql 存储 metadata 信息,需要覆盖 SQLALCHEMY_DATABASE_URI SQLALCHEMY_DATABASE_URI = "mysql://superset:strong_password@localhost:3306/superset"
如果使用官方 Helm chart 方式安装需要配置到 configOverrides

yaml 复制代码
configOverrides:
  my_override: |
    # 你的配置内容

custom_sso_security_manager.py

python 复制代码
import logging

from superset.security import SupersetSecurityManager


class CustomSsoSecurityManager(SupersetSecurityManager):
    def oauth_user_info(self, provider, response=None):
        if provider == "lark":
            me = self.appbuilder.sm.oauth_remotes[provider].get("user_info").json()['data']
            logging.debug("user_data: {0}".format(me))
            return {
                "name": me["name"],
                "email": me["email"],
                "id": me["user_id"],
                "username": me["en_name"],
                "first_name": me["en_name"],
                "last_name": me["name"],
            }

如果使用官方 Helm chart 方式安装需要配置到 extraSecrets 下面

yaml 复制代码
extraSecrets:
  custom_sso_security_manager.py: |
    # custom_sso_security_manager.py 文件内容

效果

总结

Superset 基于 Flask AppBuilder 构建,Flask AppBuilder 目前同时只支持一种认证方式,OAuth2 和密码登录只能二选一,OAuth2 用户登录之后需要通过修改数据库的方式赋予用户 Admin 角色

相关推荐
利威尔xu3 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
逃逸线LOF3 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
慢云智慧空间3 小时前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
利威尔xu4 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
知已难寻4 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
薛定谔的猫-菜鸟程序员4 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师
huainingning4 小时前
Windows syslog日志服务器搭建与模拟器对接
运维·服务器·智能路由器
say_fall4 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
wacsii5 小时前
【Linux进程(一)】Linux 进程初探:操作系统如何管理进程?fork() 为什么返回两次?
linux·运维·服务器
相思难忘成疾6 小时前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes