需要在Superset的配置文件中添加以下几行代码,以允许其他域名下的网页通过iFrame加载Superset的内容:
from flask_appbuilder.security.manager import AUTH_OIDC
...
class MySecurityManager(SupersetSecurityManager):
def view_menu(self):
views = super().view_menu()
for view in views:
if "superset_dashboardview" in view["permission"] and "can_access" in view["permission"]:
view["name"] = f'({view["name"]})'
return views
def get_user_roles(self, user):
roles = super().get_user_roles(user)
if user.is_authenticated:
roles.append(self.auth_role_public)
return roles
def init_app(app):
if not os.path.exists(SQLALCHEMY_DATABASE_URI):
os.makedirs(os.path.dirname(SQLALCHEMY_DATABASE_URI), exist_ok=True)
with app.app_context():
index = next((i for i, value in enumerate(app.extensions['appbuilder'].views) if value.name == 'Superset')), None
if index is not None:
app.extensions['appbuilder'].views[index] = SupersetView(
Superset()
)
appbuilder = app.extensions['appbuilder']
app.config.setdefault('SESSION_COOKIE_HTTPONLY', True)
app.config.setdefault('SESSION_COOKIE_SAMESITE', 'Lax')
app.config.setdefault('SESSION_COOKIE_SECURE', True)
app.config.setdefault('SESSION_REFRESH_EACH_REQUEST', False)
if app.config.get('OIDC_ENABLED'):
app.config.setdefault('OIDC_RESOURCE_SERVER_ONLY', True)
appbuilder.security_manager = MySecurityManager(appbuilder)
init_func_blueprint = partial(init_app)
同时,在Superset的配置文件(如superset_config.py)中添加以下几行代码:
from flask import Flask
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
app.before_request(PublicBlueprint.before_request)
app.register_blueprint(PublicBlueprint)
以启用CORS。通过以上操作,Superset的iFrame集成应该能够正常工作了。