конфигурация суперклавишного ключа - PullRequest
1 голос
/ 05 февраля 2020

Я пытаюсь использовать keycloak с apache superset. Я провел часы по ссылкам ниже, но не смог заменить текущий логин.

  1. Использование OpenID / Keycloak с Superset 2. Использование KeyCloak (OpenID Connect) с Apache SuperSet
  2. Использование OpenID / Keycloak с Superset

Я использую apache superset 0.34.5. В то время как выше ссылки используют 0,28 и ниже.

Я в замешательстве на начальном этапе. позвольте мне объяснить шаги и посмотреть, что мне не хватает.

Я устанавливаю суперсет с помощью pip.

У меня есть структура, у меня есть config.py и security.py на одном уровне ( У меня нет папки безопасности)

Я переименовал систему безопасности в oid_security.

Я создал файл security.py со следующим содержимым.

from flask_appbuilder.security.manager import AUTH_OID
from superset.security import SupersetSecurityManager
from flask_oidc import OpenIDConnect
from flask_appbuilder.security.views import AuthOIDView
from flask_login import login_user
from urllib.parse import quote
from flask_appbuilder.views import ModelView, SimpleFormView, expose
import logging

class AuthOIDCView(AuthOIDView):

    @expose('/login/', methods=['GET', 'POST'])
    def login(self, flag=True):
        sm = self.appbuilder.sm
        oidc = sm.oid

        @self.appbuilder.sm.oid.require_login
        def handle_login():
            user = sm.auth_user_oid(oidc.user_getfield('email'))

            if user is None:
                info = oidc.user_getinfo(['preferred_username', 'given_name', 'family_name', 'email'])
                user = sm.add_user(info.get('preferred_username'), info.get('given_name'), info.get('family_name'), info.get('email'), sm.find_role('Gamma'))

            login_user(user, remember=False)
            return redirect(self.appbuilder.get_url_for_index)

        return handle_login()

    @expose('/logout/', methods=['GET', 'POST'])
    def logout(self):

        oidc = self.appbuilder.sm.oid

        oidc.logout()
        super(AuthOIDCView, self).logout()
        redirect_url = request.url_root.strip('/') + self.appbuilder.get_url_for_login

        return redirect(oidc.client_secrets.get('issuer') + '/protocol/openid-connect/logout?redirect_uri=' + quote(redirect_url))

class OIDCSecurityManager(SupersetSecurityManager):
    authoidview = AuthOIDCView
    def __init__(self,appbuilder):
        super(OIDCSecurityManager, self).__init__(appbuilder)
        if self.auth_type == AUTH_OID:
            self.oid = OpenIDConnect(self.appbuilder.get_app)

Затем я создал собственный менеджер со следующим

from flask_appbuilder.security.manager import AUTH_OID
from flask_appbuilder.security.sqla.manager import SecurityManager
from flask_oidc import OpenIDConnect
class OIDCSecurityManager(SecurityManager):

    def __init__(self, appbuilder):
        super(OIDCSecurityManager, self).__init__(appbuilder)
        if self.auth_type == AUTH_OID:
            self.oid = OpenIDConnect(self.appbuilder.get_app)
        self.authoidview = AuthOIDCView

я создал секрет клиента. json со своими учетными данными. Я отредактировал файл конфигурации, как показано ниже.

from superset.security import OIDCSecurityManager
AUTH_TYPE = AUTH_OID
OIDC_CLIENT_SECRETS = 'client_secret.json'
OIDC_ID_TOKEN_COOKIE_SECURE = False
OIDC_REQUIRE_VERIFIED_EMAIL = False
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = 'Gamma'
CUSTOM_SECURITY_MANAGER = OIDCSecurityManager

Здесь следует упомянуть наличие менеджера py в папке безопасности в flask appbuilder, в котором есть Abstract Security Manager cls. Я получаю сообщение об ошибке безопасности py

Он говорит, что не может импортировать имя SupersetSecurityManager из superset - кто-нибудь, пожалуйста, безопасность?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Затем я создал пользовательский менеджер со следующим

, где его обновить ??

из flask_appbuilder.security.manager import AUTH_OID из flask_appbuilder.security.sqla.manager import SecurityManager from flask_oid c импорт класса OpenIDConnect OIDCSecurityManager (SecurityManager):

def __init__(self, appbuilder):
    super(OIDCSecurityManager, self).__init__(appbuilder)
    if self.auth_type == AUTH_OID:
        self.oid = OpenIDConnect(self.appbuilder.get_app)
    self.authoidview = AuthOIDCView
0 голосов
/ 10 февраля 2020

Я предлагаю вам начать сначала sh и выполнить шаги, которые сработали для меня:

  1. Создать виртуальную среду в каталоге superset и активировать ее.
  2. Установить flask -oid c и superset плагины в вашей виртуальной среде. pip install flask -oid c
  3. Имейте файл oidc_security.py со скриптом, который вы вставили выше, т.е. security.py в вашей настройке.
  4. Имейте файл client_secret. json с вашей конфигурацией keycloak.
  5. Имейте superset_config.py со скриптом, который вы вставили выше.
  6. Добавьте все эти три файла в ваш pythonpath .
  7. Выполнить superset db upgrade & superset init команды.
  8. Наконец, выполните superset run . После завершения инициализации перейдите к http://localhost: 8088 в вашем браузере. Ожидаемое поведение: вы будете перенаправлены на keycloak для входа / регистрации. После успешного входа вы будете перенаправлены в приложение superset.

Надеюсь, это поможет. Пишите обратно, если вы добились успеха или столкнулись с ошибкой.

...