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 角色

相关推荐
苍何3 小时前
原来世界模型,已经能边玩边生成了
后端
数字护盾(和中)3 小时前
和中科技剖析 EDR 绕过全链路,AMSI、ETW 规避技术与防御对策
运维·网络·人工智能·科技·安全·web安全
七牛开发者3 小时前
拆解 DeepSeek Harness:Profile 与 Bundle 如何装配运行时
前端·javascript·后端
HjhIron3 小时前
从零搭建后端业务:数据库表设计、索引优化与部署架构解析
后端
Zane19943 小时前
为什么 del 一个对象有时立刻消失,有时却纹丝不动?一文讲透引用计数与垃圾回收
后端·python
编码浪子4 小时前
Rust 智能指针深度实战:Box/Rc/Arc/RefCell 选型决策与内存管理避坑
开发语言·后端·rust
提线木偶4 小时前
CORS 到底谁说了算?一份跨域配置的避坑指南
前端·后端
天远Date Lab4 小时前
零信任架构实战:基于天远普通维保查询构建自动化车辆收车评估网关
运维·人工智能·架构·自动化
流星白龙5 小时前
【Docker】9.Docker 镜像仓库实战
运维·docker·容器
张洛闻Eren5 小时前
云原生k8s【第六课】:K8s 访问控制
运维·docker·云原生·容器·kubernetes·k8s