Integració de Keycloak amb Superset

23 de febrer de 2026 per
Integració de Keycloak amb Superset
Jordi Isidro

És una bona pràctica dins de les entitats poder tenir només un usuari i paraula de pas centralitzada per a entrar a tots els sistemes. L’eina principal de Single Sign On (SSO) de programari lliure per a poder-ho fer és Keycloak.

En aquest post veurem com integrar el SSO de Keycloak amb el nostre portal de quadres de comandament en Apache Superset.

Configuració de Keycloak

Abans de modificar la configuració de Superset hem de configurar Keycloak, per exemple per a crear els usuaris, grups, seguretat.

Tenim ja creat el realm Coopdevs Treball que és on configurarem les credencials, els usuaris i grups que serviran per al Superset.


Dins del real crearem un nou client anomenat businessintelligence.


I, dins del client, configurarem les URLs des d’on es podrà invocar. En el nostre cas: https://bi-ubuntu24.coopdevs.org/oauth-authorized/keycloak* , que és on tenim el Superset executant-se, afegint la part d’autorització del keycloak.

A dins de Credentials, copiarem el Client Secret que necessitarem més endavant.


També crearem Roles, en el nostre cas SupersetAdmin i SupersetReader, que ens serviran després per a assignar els rols de Superset.


I assignarem usuaris a cadascun dels grups.

En aquest moment ja tenim tot el necessari configurat a keycloak i podem passar a configurar Superset.


Configuració de Superset

El primer que hem de fer és instal·lar les llibreries python necessàries.
En aquest cas només la llibreria authlib.
Per fer-ho s’ha de modificar el fitxer docker/requirements-local.txt de dins de la carpeta on hem baixat el Superset.

Ara haurem de fer modificacions al fitxer external/superset_config.py
Primer haurem d’afegir uns quants imports:

import jwt
import urllib.request
import json
from flask import g

from superset.security import SupersetSecurityManager
from celery.schedules import crontab
from flask_appbuilder.security.manager import AUTH_OAUTH,AUTH_OID,AUTH_DB
from flask_appbuilder.security.sqla.manager import SecurityManager
from flask_appbuilder.security.sqla.models import User
from flask import current_app as app

Després haurem d’afegir unes quantes línies de codi ABANS d’aquesta part:

try:
    import superset_config_docker
    from superset_config_docker import *  # noqa

    logger.info(
        f"Loaded your Docker configuration at " f"[{superset_config_docker.__file__}]"
    )
except ImportError:
    logger.info("Using default Docker config...")

Primer indicarem que volem que l’autenticació sigui per OAUTH

AUTH_TYPE = AUTH_OAUTH

Després definim la URL per a fer logout que conté la URL del nostre realm de Keycloak afegint /openid-connect/logout:

LOGOUT_REDIRECT_URL='https://auth.coopdevs.coop/realms/Coopdevs%20Treball/protocol/openid-connect/logout'

Afegim les configuracions de guest token, només si volem tenir en algun moment dashboards embeded.

GUEST_TOKEN_JWT_SECRET = "blablablabla"
GUEST_TOKEN_JWT_EXP_SECONDS = 3600  # 1 hour

Configurem els flags que indiquen si els rols s’han de sincronitzar al fer login, si permetem registre al superset quan es fa login per primera vegada al Keycloak, i el rol per defecte dels usuaris que fan login.

AUTH_ROLES_SYNC_AT_LOGIN = True
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = "Public"

Per altra banda també podem crear el mapeig entre els rols de Keycloak amb els de Superset. Per exemple els usuari que estiguin SupersetAdmin de Keycloak tindrà els rols Admin i sql_lab a Superset, i els que estiguin a SupersetReader tindran el rol Public.

AUTH_ROLES_MAPPING = {
    'SupersetAdmin': ['Admin', 'sql_lab'],
    'SupersetReader': ['Public'],
}

Després hem de configurar els proveïdors d’OAUTH, en el nostre cas Keycloak, però podríeu configurar-ne d’altres, com Gitlab.

Aquí necessitarem el secret que hem guardat quan hem configurat el Keycloak.

Cal modificar https://auth.coopdevs.coop/realms/Coopdevs%20Treball pel vostre realm.

OAUTH_PROVIDERS = [
    {
        'name': 'keycloak',
        'token_key': 'access_token',
        'icon': 'fa-key',
        'remote_app': {
            'client_id': 'businessintelligence', 
            'client_secret': '<el secret que hem copiat abans>',  
            'api_base_url': 'https://auth.coopdevs.coop/realms/Coopdevs%20Treball/protocol/openid-connect/',  # Replace with your Keycloak realm URL
            'client_kwargs': {
                'scope': 'openid profile email',
                'roles_key': 'realm_access.roles',
            },
            'server_metadata_url': 'https://auth.coopdevs.coop/realms/Coopdevs%20Treball/.well-known/openid-configuration',
            'access_token_url': 'https://auth.coopdevs.coop/realms/Coopdevs%20Treball/protocol/openid-connect/token',
            'authorize_url': 'https://auth.coopdevs.coop/realms/Coopdevs%20Treball/protocol/openid-connect/auth',
            'jwks_uri': 'https://auth.coopdevs.coop/realms/Coopdevs%20Treball/protocol/openid-connect/certs',
        },
    }
]

Finalment haurem de crear la funció encarregada de fer el login

class CustomSsoSecurityManager(SupersetSecurityManager):
    def oauth_user_info(self, provider, response=None):  
                me = self.appbuilder.sm.oauth_remotes[provider].get("userinfo")
        me.raise_for_status()
        data = me.json()
        logging.debug("User info from Keycloak: %s", data)
        token = self.appbuilder.sm.oauth_remotes[provider].token
        access_token=token["access_token"]
        decoded_access = jwt.decode(access_token, options={"verify_signature": False})
        roles = []
        try:
            roles = decoded_access["realm_access"]["roles"]
        except Exception:
            pass
        return {
            "username": data.get("preferred_username", ""),
            "first_name": data.get("given_name", ""),
            "last_name": data.get("family_name", ""),
            "email": data.get("email", ""),
            "role_keys": roles,
        }

CUSTOM_SECURITY_MANAGER = CustomSsoSecurityManager

Un cop modificat aquest fitxer ja podem reiniciar el servei del docker i entrar per Keycloak al nostre Superset.