原文:
下载
git clone https://github.com/apache/incubator-superset/
cd incubator-superset/contrib/docker
# prefix with SUPERSET_LOAD_EXAMPLES=yes to load examples:
docker-compose run --rm superset ./docker-init.sh
# you can run this command everytime you need to start superset now:
docker-compose up
superset官方文档指南
CONTRIBUTING.md#building
https://github.com/apache/incubator-superset/blob/master/CONTRIBUTING.md#building
非开发模式设置
incubator-superset-master\contrib\文件夹下
dockerdocker-compose.yml中变量SUPERSET_ENV:production
OS 依赖
Superset将数据库连接信息存储在其元数据数据库中。 为此,我们使用加密Python库来加密连接密码。 不幸的是,这个库具有操作系统级依赖性。
Debian and Ubuntu
sudo apt-get install build-essential libssl-dev libffi-dev python-dev python-pip libsasl2-dev libldap2-dev
如果安装了python3.6和python2.7,Ubuntu 18.04 LTS
sudo apt-get install build-essential libssl-dev libffi-dev python3.6-dev python-pip libsasl2-dev libldap2-dev
Fedora and RHEL
sudo yum upgrade python-setuptools
sudo yum install gcc gcc-c++ libffi-devel python-devel python-pip python-wheel openssl-devel libsasl2-devel openldap-devel
OSX
系统python不推荐,会报错:
system python is not recommended. brew’s python also ships with pip
解决:
brew install pkg-config libffi openssl python
env LDFLAGS="-L$(brew --prefix openssl)/lib" CFLAGS="-I$(brew --prefix openssl)/include" pip install cryptography==2.4.2
Windows
未得到官方支持,若想在windows下安装,可下载get-pip.py
https://bootstrap.pypa.io/get-pip.py
然后运行 python get-pip.py (可能需要admin访问)
C:\> pip install cryptography
# You may also have to create C:\Temp
C:\> md C:\Temp
Python virtualenv
建议在virtualenv中安装Superset。可通过系统包安装,或者通过pip安装
pip install virtualenv
创建和激活virtualenv
# virtualenv is shipped in Python 3.6+ as venv instead of pyvenv.
# See https://docs.python.org/3.6/library/venv.html
python3 -m venv venv
. venv/bin/activate
在windows激活语法不同:
venv\Scripts\activate
一旦激活了virtualenv,所做的一切都被限制在virtualenv中。 要退出virtualenv,只需键入deactivate即可。
Python安装 tools and pip
获取最新的pip and setuptools
pip install --upgrade setuptools pip
Superset 安装和初始化
# Install superset
pip install superset
# Create an admin user (you will be prompted to set a username, first and last name before setting a password)
fabmanager create-admin --app superset
# Initialize the database
superset db upgrade
# Load some data to play with
superset load_examples
# Create default roles and permissions
superset init
# To start a development web server on port 8088, use -p to bind to another port
superset runserver -d
安装以后,可在浏览器里访问:http://localhost:8088
使用在创建管理员账户时输入的账户和密码,然后
Menu -> Admin -> Refresh Metadata //引入Superset的所有数据源
Menu -> Datasources //显示Superset的所有数据源
A proper WSGI HTTP Server
虽然可以设置Superset在Nginx或Apache上运行,但许多人使用Gunicorn,最好是在异步模式下,这样可以实现令人印象深刻的并发性,并且相当容易安装和配置。
设置Flask WSGI应用程序,这是一个良好的异步设置:
gunicorn \
-w 10 \
-k gevent \
--timeout 120 \
-b 0.0.0.0:6666 \
--limit-request-line 0 \
--limit-request-field_size 0 \
--statsd-host localhost:8125 \
superset:app
请注意,gunicorn在Windows上不起作用,因此superset runserver命令不会起作用。
另请注意,开发Web服务器(superset runserver -d)不适合生产使用。
如果不使用gunicorn,可以通过在superset_config.py中设置ENABLE_FLASK_COMPRESS = False来禁用flask-compress的使用
Flask-AppBuilder 权限
默认情况下,每次初始化Flask-AppBuilder(FAB)应用程序时,权限和视图都会自动添加到后端并与“管理员”角色关联。 但问题是,当运行多个并发工作程序时,这会在定义权限和视图时产生大量争用和竞争条件。
要缓解此问题,可以通过将环境变量SUPERSET_UPDATE_PERMS环境变量设置为0来禁用权限的自动更新。值1启用它,0禁用它。 请注意,如果未定义,则启用该功能以保持向后兼容性。
在生产环境中,初始化可以采用以下形式:
export SUPERSET_UPDATE_PERMS = 1 superset init
export SUPERSET_UPDATE_PERMS = 0 gunicorn -w 10 ... superset:app
负载均衡配置
如果在负载均衡器或反向代理(例如AWS上的NGINX或ELB)上运行superset,则可能需要使用运行a healthcheck endpoint,以便负载均衡器知道superset实例是否正在运行。 这在/ health中提供,如果Web服务器正在运行,它将返回包含“OK”的200响应。
如果负载均衡器正在 inserting X-Forwarded-For/X-Forwarded-Proto headers,则应在superset配置文件中设置ENABLE_PROXY_FIX = True以提取和使用headers。
在反向代理用于提供ssl加密的情况下,可能需要X-Forwarded-Proto的明确定义。 对于Apache Web服务器,可以设置如下:
RequestHeader set X-Forwarded-Proto "https"
配置
要配置应用程序,需要创建一个文件(模块)superset_config.py并确保它在PYTHONPATH中。 以下是可以在该配置模块中复制/粘贴的一些参数:
#---------------------------------------------------------
# Superset specific config
#---------------------------------------------------------
ROW_LIMIT = 5000
SUPERSET_WEBSERVER_PORT = 8088
#---------------------------------------------------------
#---------------------------------------------------------
# Flask App Builder configuration
#---------------------------------------------------------
# Your App secret key
SECRET_KEY = '\2\1thisismyscretkey\1\2\e\y\y\h'
# The SQLAlchemy connection string to your database backend
# This connection defines the path to the database that stores your
# superset metadata (slices, connections, tables, dashboards, ...).
# Note that the connection information to connect to the datasources
# you want to explore are managed directly in the web UI
SQLALCHEMY_DATABASE_URI = 'sqlite:////path/to/superset.db'
# Flask-WTF flag for CSRF
WTF_CSRF_ENABLED = True
# Add endpoints that need to be exempt from CSRF protection
WTF_CSRF_EXEMPT_LIST = []
# A CSRF token that expires in 1 year
WTF_CSRF_TIME_LIMIT = 60 * 60 * 24 * 365
# Set this API key to enable Mapbox visualizations
MAPBOX_API_KEY = ''
可以在本地superset_config.py中更改
https://github.com/apache/incubator-superset/blob/master/superset/config.py中定义的所有参数和默认值。
管理员将希望通读该文件以了解可在本地配置的内容以及适当的默认值。
由于superset_config.py充当Flask配置模块,因此可用于更改Flask本身的设置,以及诸如flask-wtf,flask-cache,flask-migrate和flask-appbuilder之类的Flask扩展。 Flask App Builder,Superset使用的Web框架提供了许多配置设置。 有关如何配置它的更多信息,请参阅Flask App Builder文档。
https://flask-appbuilder.readthedocs.io/en/latest/config.html
确保更改:
SQLALCHEMY_DATABASE_URI,默认情况下存储在〜/ .superset / superset.db
SECRET_KEY,一个长的随机字符串
如果您需要从CSRF中免除endpoints,例如 如果您正在运行 a custom auth postback endpoint,则可以将它们添加到WTF_CSRF_EXEMPT_LIST
WTF_CSRF_EXEMPT_LIST = [‘’]
数据库依赖
除了Sqlite(它是Python标准库的一部分)之外,Superset不捆绑连接到数据库。 需要为要用作源数据数据库的数据库安装所需的软件包,以及连接到要通过Superset访问的数据库所需的软件包。
这是一些推荐包的列表。
database | pypi package | SQLAlchemy URI prefix |
---|---|---|
MySQL | pip install mysqlclient | mysql:// |
Postgres | pip install psycopg2 | postgresql+psycopg2:// |
Presto | pip install pyhive | presto:// |
Hive | pip install pyhive | hive:// |
Oracle | pip install cx_Oracle | oracle:// |
sqlite | sqlite:// | |
Snowflake | pip install snowflake-sqlalchemy | snowflake:// |
Redshift | pip install sqlalchemy-redshift | redshift+psycopg2:// |
MSSQL | pip install pymssql | mssql:// |
Impala | pip install impyla | impala:// |
SparkSQL | pip install pyhive | jdbc+hive:// |
Greenplum | pip install psycopg2 | postgresql+psycopg2:// |
Athena | pip install "PyAthenaJDBC>1.0.9" | awsathena+jdbc:// |
Athena | pip install "PyAthena>1.2.0" | awsathena+rest:// |
Vertica | pip install sqlalchemy-vertica-python | vertica+vertica_python:// |
ClickHouse | pip install sqlalchemy-clickhouse | clickhouse:// |
Kylin | pip install kylinpy | kylin:// |
BigQuery | pip install pybigquery | bigquery:// |
Teradata | pip install sqlalchemy-teradata | teradata:// |
Pinot | pip install pinotdb | pinot+http://controller:5436/ query?server=http://controller:5983/ |
(AWS) Athena
Athena的连接:
awsathena+jdbc://{aws_access_key_id}:{aws_secret_access_key}@athena.{region_name}.amazonaws.com/{schema_name}?s3_staging_dir={s3_staging_dir}&...
需要转义/编码至少s3_staging_dir的地方,即
s3://... -> s3%3A//...
也可以像这样使用PyAthena库(不需要java)
awsathena+rest://{aws_access_key_id}:{aws_secret_access_key}@athena.{region_name}.amazonaws.com/{schema_name}?s3_staging_dir={s3_staging_dir}&...
PyAthena
https://github.com/laughingman7743/PyAthena#sqlalchemy
MSSQL
完整的Unicode支持需要SQLAlchemy 1.3或更高版本。
Snowflake
Snowflake的连接:
snowflake://{user}:{password}@{account}.{region}/{database}?role={role}&warehouse={warehouse}
这个连接模式不是必须的,因为它是按表/查询定义的。 如果为用户定义了默认值,则可以省略角色和仓库,即
snowflake://{user}:{password}@{account}.{region}/{database}
确保用户具有访问和使用所有必需databases/schemas/tables/views/warehouses的权限,因为Snowflake SQLAlchemy引擎在引擎创建期间不测试用户权限。
Snowflake SQLAlchemy
https://github.com/snowflakedb/snowflake-sqlalchemy
Teradata
Teradata的连接:
teradata://{user}:{password}@{host}
注意:需要安装Teradata ODBC驱动程序并配置环境变量才能正确使用sqlalchemy。 Teradata ODBC驱动程序可在此处获得:
https://downloads.teradata.com/download/connectivity/odbc-driver/linux
环境变量:
export ODBCINI=/.../teradata/client/ODBC_64/odbc.ini
export ODBCINST=/.../teradata/client/ODBC_64/odbcinst.ini
Teradata SQLAlchemy
https://github.com/Teradata/sqlalchemy-teradata
Caching
Superset使用Flask-Cache进行缓存。 配置缓存后端就像在superset_config.py中提供符合Flask-Cache规范的CACHE_CONFIG常量一样简单。
https://pythonhosted.org/Flask-Cache/
Flask-Cache支持多个缓存后端(Redis,Memcached,SimpleCache(内存)或本地文件系统)。 如果打算使用Memcached,请使用pylibmc客户端库,因为python-memcached不能正确处理二进制数据。 如果您使用Redis,请安装redis Python包:
pip install redis
为了设置超时,这可以在Superset元数据中完成,并从“切片配置”,到数据源配置到数据库的“超时搜索路径”上,最终到CACHE_CONFIG中定义的全局默认值。
CACHE_CONFIG = {
'CACHE_TYPE': 'redis',
'CACHE_DEFAULT_TIMEOUT': 60 * 60 * 24, # 1 day default (in secs)
'CACHE_KEY_PREFIX': 'superset_results',
'CACHE_REDIS_URL': 'redis://localhost:6379/0',
}
Deeper SQLAlchemy integration
可以使用SQLAlchemy公开的参数调整数据库连接信息。 在数据库编辑视图中,将找到一个额外的字段作为JSON blob。
此JSON串包含额外的配置元素。 engine_params对象被解压缩到sqlalchemy.create_engine调用中,而metadata_params被解压缩到sqlalchemy.MetaData调用中。 有关更多信息,请参阅SQLAlchemy文档。
http://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine
http://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData
Schemas (Postgres & Redshift)
Postgres和Redshift以及其他数据库使用模式的概念作为数据库之上的逻辑实体。 对于Superset连接到特定模式,可以在表格形式中设置模式参数。
SQLAlchemy连接的外部密码存储
可以为您的数据库密码使用外部存储。 如果运行自定义秘密分发框架并且不希望在Superset的元数据库中存储机密,这将非常有用。
示例:编写一个函数,该函数接受sqla.engine.url类型的单个参数,并返回给定连接的密码。 然后在配置文件中设置SQLALCHEMY_CUSTOM_PASSWORD_STORE以指向该函数。
def example_lookup_password(url):
secret = <<get password from external framework>>
return 'secret'
SQLALCHEMY_CUSTOM_PASSWORD_STORE = example_lookup_password
一种常见的模式是使用环境变量来设置秘密,即 SQLALCHEMY_CUSTOM_PASSWORD_STORE。
def example_password_as_env_var(url):
# assuming the uri looks like
# mysql://localhost?superset_user:{SUPERSET_PASSWORD}
return url.password.format(os.environ)
SQLALCHEMY_CUSTOM_PASSWORD_STORE = example_password_as_env_var
SSL 访问数据库
此示例适用于需要SSL的MySQL数据库。 配置可能与其他后端不同。 这是额外参数中的内容:
{
"metadata_params": {},
"engine_params": {
"connect_args":{
"sslmode":"require",
"sslrootcert": "/path/to/my/pem"
}
}
}
Druid
1)在UI中,通过按+号在Sources - > Druid Clusters菜单中输入有关群集的信息。
2)输入Druid 集群连接信息后,点击Sources-> Refresh Druid Metadata菜单项进行填充
3)导航到您的数据源
请注意,可以运行superset refresh_druid命令来刷新Druid集群中的元数据
CORS
必须安装额外的CORS依赖关系:
superset [CORS]
可以指定superset_config.py中的以下来配置CORS:
ENABLE_CORS:必须设置为True才能启用CORS
CORS_OPTIONS:传递给Flask-CORS的选项(文档<http://flask-cors.corydolphin.com/en/latest/api.html#extension>)
DOMAIN SHARDING
Chrome一次最多允许每个域6个开放连接。 当仪表板中有超过6个切片时,很多时间提取请求排队等待下一个可用套接字。
PR(#5039 <https://github.com/apache/incubator-superset/pull/5039>)将域分片添加到Superset,此功能将仅通过配置启用(默认情况下,Superset不允许跨域 请求)。
SUPERSET_WEBSERVER_DOMAINS:域分片功能允许的主机名列表。 默认无
MIDDLEWARE(中间件)
Superset允许您添加自己的中间件。 要添加自己的中间件,请更新superset_config.py中的ADDITIONAL_MIDDLEWARE项。 ADDITIONAL_MIDDLEWARE应该是您的其他中间件类的列表。
例如,要从像nginx这样的代理服务器后面使用AUTH_REMOTE_USER,您必须添加一个简单的中间件类,以将HTTP_X_PROXY_REMOTE_USER(或代理中的任何其他自定义标头)的值添加到Gunicorn的REMOTE_USER环境变量中:
class RemoteUserMiddleware(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
user = environ.pop('HTTP_X_PROXY_REMOTE_USER', None)
environ['REMOTE_USER'] = user
return self.app(environ, start_response)
ADDITIONAL_MIDDLEWARE = [RemoteUserMiddleware, ]
http://flask.pocoo.org/snippets/69/
Upgrading升级
pip install superset --upgrade
superset db upgrade
superset init
我们建议在升级Superset时遵循标准最佳实践,例如在升级之前进行数据库备份,在升级生产之前升级临时环境,以及在平台上较少用户活动时升级生产。
注意:某些升级可能包含向后不兼容的更改,或者需要安排停机时间,在这种情况下,贡献者会在存储库中的UPDATING.md中附加注释。 建议在运行升级之前查看此文件。
Celery Tasks
在大型分析数据库中,通常运行执行数分钟或数小时的后台作业,报告和/或查询。 在某些情况下,需要支持超出典型Web请求超时(30-60秒)执行的长时间运行的任务。
在大型分析数据库中,运行执行数分钟或数小时的查询是很常见的。 要为超出典型Web请求超时(30-60秒)的超长运行查询启用支持,必须为Superset配置异步后端,其中包括:
1)一个或多个Superset工作者(实现为Celery工作者),可以使用celery worker命令启动,运行celery worker --help查看相关选项。
2)建议使用Redis或RabbitMQ的a celery broker(消息队列)
3)a results backend,用于定义worker将持久保存查询结果的位置
配置Celery需要在superset_config.py中定义CELERY_CONFIG。 工作服务器和Web服务器进程都应具有相同的配置。
class CeleryConfig(object):
BROKER_URL = 'redis://localhost:6379/0'
CELERY_IMPORTS = (
'superset.sql_lab',
'superset.tasks',
)
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERYD_LOG_LEVEL = 'DEBUG'
CELERYD_PREFETCH_MULTIPLIER = 10
CELERY_ACKS_LATE = True
CELERY_ANNOTATIONS = {
'sql_lab.get_sql_results': {
'rate_limit': '100/s',
},
'email_reports.send': {
'rate_limit': '1/s',
'time_limit': 120,
'soft_time_limit': 150,
'ignore_result': True,
},
}
CELERYBEAT_SCHEDULE = {
'email_reports.schedule_hourly': {
'task': 'email_reports.schedule_hourly',
'schedule': crontab(minute=1, hour='*'),
},
}
CELERY_CONFIG = CeleryConfig
要启动Celery工作程序以利用配置运行:
celery worker --app=superset.tasks.celery_app:app --pool=prefork -Ofair -c 4
要启动计划定期后台作业的作业,请运行
celery beat --app=superset.tasks.celery_app:app
要设置a results backend,需要将werkzeug.contrib.cache.BaseCache的派生实例传递给superset_config.py中的RESULTS_BACKEND配置键。 可以使用Memcached,Redis,S3(https://pypi.python.org/pypi/s3werkzeugcache),内存或文件系统(在单一服务器类型的设置或测试中),或编写自己的缓存接口。 您的superset_config.py可能类似于:
# On S3
from s3cache.s3cache import S3Cache
S3_CACHE_BUCKET = 'foobar-superset'
S3_CACHE_KEY_PREFIX = 'sql_lab_result'
RESULTS_BACKEND = S3Cache(S3_CACHE_BUCKET, S3_CACHE_KEY_PREFIX)
# On Redis
from werkzeug.contrib.cache import RedisCache
RESULTS_BACKEND = RedisCache(
host='localhost', port=6379, key_prefix='superset_results')
注意:
1)重要的是,Superset群集中的所有工作节点和Web服务器共享一个公共元数据数据库。 这意味着SQLite将无法在此上下文中工作,因为它对并发性的支持有限,并且通常位于本地文件系统上。
2)在整个设置中应该只有celery beat的一个实例运行。 如果没有,后台作业可以多次安排,导致奇怪的行为,如重复交付报告,高于预期的负载/流量等。
Email Reports
电子邮件报告允许用户安排电子邮件报告
1)切片和仪表板可视化(附件或内联)
2)切片数据(内联表中的CSV附件)
计划以crontab格式定义,每个计划可以有一个收件人列表(所有收件人都可以收到一封邮件或单独的邮件)。 出于审计目的,所有外发邮件都可以具有强制性密件抄送。
要求:
1)兼容硒的驱动程序和无头浏览器
1.1 geckodriver和Firefox是首选
1.2 chromedriver也是一个不错的选择
2)运行 celery worker and celery beat 如下
celery worker --app=superset.tasks.celery_app:app --pool=prefork -Ofair -c 4
celery beat --app=superset.tasks.celery_app:app
注意:
1)请注意celery 的并发设置(使用-c 4)。 Selenium / webdriver实例可能会占用服务器上的大量CPU /内存。
2)在某些情况下,如果发现许多泄漏的geckodriver进程,请尝试运行celery 进程
celery worker --pool=prefork --max-tasks-per-child=128 ...
3)建议为sql_lab和email_reports任务运行单独的worker。 可以通过在CELERY_ANNOTATIONS中使用queue字段来完成
SQL Lab
SQL Lab是一个功能强大的SQL IDE,适用于所有SQLAlchemy兼容数据库。 默认情况下,查询在Web请求的范围内执行,因此当查询超过环境中Web请求的最大持续时间时,它们最终可能会超时,无论它是反向代理还是Superset服务器本身。 在这种情况下,最好使用celery在后台运行查询。 请按照上面提到的示例/注释来使celery设置正常工作。
另请注意,SQL Lab在查询中支持Jinja模板,并且可以通过在superset配置中定义JINJA_CONTEXT_ADDONS来重载环境中的默认Jinja上下文。 此字典中引用的对象可供用户在其SQL中使用。
JINJA_CONTEXT_ADDONS = {
'my_crazy_macro': lambda x: x*2,
}
Celery Flower
Flower是一个基于Web的工具,用于监视Celery集群,可以从pip安装:
pip install flower
运行:
celery flower --app=superset.tasks.celery_app:app
Building from source
更高级的用户可能希望从源代码构建Superset。 如果将fork项目以添加特定于环境的功能,则会出现这种情况。 请参阅CONTRIBUTING.md#setup-local-environment-for-development。
https://github.com/apache/incubator-superset/blob/master/CONTRIBUTING.md#setup-local-environment-for-development
Blueprints蓝图
蓝图是Flask的可重用应用程序。 Superset允许您在superset_config模块中指定一组蓝图。 这是一个如何使用简单蓝图的示例。 通过这样做,可以期待Superset在/ simple_page网址上提供“OK”的页面。 这可以允许在同一服务器上运行其他内容,例如自定义数据可视化应用程序和Superset。
from flask import Blueprint
simple_page = Blueprint('simple_page', __name__,
template_folder='templates')
@simple_page.route('/', defaults={'page': 'index'})
@simple_page.route('/<page>')
def show(page):
return "Ok"
BLUEPRINTS = [simple_page]
StatsD logging
如果需要,可以使用Superset将事件记录到StatsD。 记录的大多数端点以及SQL实验室中的查询开始和结束等关键事件都会被记录。
要设置StatsD日志记录,需要在superset_config.py中配置记录器。
from superset.stats_logger import StatsdStatsLogger
STATS_LOGGER = StatsdStatsLogger(host='localhost', port=8125, prefix='superset')
请注意,也可以通过派生来实现自己的记录器
superset.stats_logger.BaseStatsLogger
在Kubernetes中使用helm安装Superset
您可以使用Helm <https://helm.sh/>将Superset安装到Kubernetes中。 该图表位于install / helm中。
要将Superset安装到Kubernetes中:
helm upgrade --install superset ./install/helm/superset
请注意,上面的命令会将Superset安装到Kubernetes集群的默认命名空间中。
自定义OAuth2 配置
除了FAB支持的提供商(github,twitter,linkedin,google,azure)之外,还可以轻松地将Superset与支持“代码”授权的其他OAuth2授权服务器实现连接起来。
第一步:在Superset superset_config.py中配置授权。
AUTH_TYPE = AUTH_OAUTH
OAUTH_PROVIDERS = [
{ 'name':'egaSSO',
'token_key':'access_token', # Name of the token in the response of access_token_url
'icon':'fa-address-card', # Icon for the provider
'remote_app': {
'consumer_key':'myClientId', # Client Id (Identify Superset application)
'consumer_secret':'MySecret', # Secret for this Client Id (Identify Superset application)
'request_token_params':{
'scope': 'read' # Scope for the Authorization
},
'access_token_method':'POST', # HTTP Method to call access_token_url
'access_token_params':{ # Additional parameters for calls to access_token_url
'client_id':'myClientId'
},
'access_token_headers':{ # Additional headers for calls to access_token_url
'Authorization': 'Basic Base64EncodedClientIdAndSecret'
},
'base_url':'https://myAuthorizationServer/oauth2AuthorizationServer/',
'access_token_url':'https://myAuthorizationServer/oauth2AuthorizationServer/token',
'authorize_url':'https://myAuthorizationServer/oauth2AuthorizationServer/authorize'
}
}
]
# 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 = "Public"
第二步:创建一个扩展SupersetSecurityManager并覆盖oauth_user_info的CustomSsoSecurityManager:
from superset.security import SupersetSecurityManager
class CustomSsoSecurityManager(SupersetSecurityManager):
def oauth_user_info(self, provider, response=None):
logging.debug("Oauth2 provider: {0}.".format(provider))
if provider == 'egaSSO':
# As example, this line request a GET to base_url + '/' + userDetails with Bearer Authentication,
# and expects that authorization server checks the token, and response with user details
me = self.appbuilder.sm.oauth_remotes[provider].get('userDetails').data
logging.debug("user_data: {0}".format(me))
return { 'name' : me['name'], 'email' : me['email'], 'id' : me['user_name'], 'username' : me['user_name'], 'first_name':'', 'last_name':''}
...
此文件必须与superset_config.py位于同一目录,名称为custom_sso_security_manager.py。
然后可以将这两行添加到superset_config.py:
from custom_sso_security_manager import CustomSsoSecurityManager
CUSTOM_SECURITY_MANAGER = CustomSsoSecurityManager