У объекта «AnonymousUserMixin» нет ошибки «роли» атрибута в Airflow Webserver при использовании LDAP с RBAC Flask-AppBuilder - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь интегрировать аутентификацию Airflow Webserver с RBAC Flask-AppBuilder, доступным в Airflow 1.10.0, но независимо от настроек конфигурации, которые я пробую, я получаю AttributeError: 'AnonymousUserMixin' object has no attribute 'roles'.

Ранее я получил бэкэнд аутентификации Airflow LDAP для работы с LDAP-сервером AD моей организации, но не могу правильно настроить параметры конфигурации, чтобы он работал с FAB RBAC. Документация Airflow и FAB мало что может сказать о LDAP или об устранении неполадок.

В файле ${AIRFLOW_HOME}/webserver_config.py у меня есть

# The authentication type
AUTH_TYPE = AUTH_LDAP

AUTH_ROLE_PUBLIC = "Public"
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = "Public"

AUTH_LDAP_SERVER = "ldaps://ldaps.myorg.org:636"
AUTH_LDAP_BIND_USER = "CN=myuser,OU=Service Accounts,DC=myorg,DC=org"
AUTH_LDAP_BIND_PASSWORD = "relevant_password"
AUTH_LDAP_SEARCH = "DC=myorg,DC=org"
AUTH_LDAP_UID_FIELD = "sAMAccountName"
# AUTH_LDAP_ALLOW_SELF_SIGNED = True
AUTH_LDAP_USE_TLS = False
AUTH_LDAP_APPEND_DOMAIN = "myorg.org"
AUTH_ROLE_ADMIN = "Admin"

А в {AIRFLOW_HOME}/airflow.cfg у меня

[webserver]
authenticate = True
rbac = True

Я уже обновил внутреннюю базу данных Postgres, чтобы она имела таблицы ab_.

Когда я развертываю все через Docker Swarm и перехожу на соответствующий URL-адрес веб-сервера, я просто получаю сообщение об ошибке, приведенное выше, с трассировкой стека. Это никогда не дает мне возможности войти в систему (и я попытался очистить куки), поэтому я не понимаю, как заставить его «анонимного» пользователя даже пытаться аутентифицироваться на LDAP AD.

Является ли проблема

  • настройки webserver_config.py LDAP?
  • кавычки вокруг этих настроек?
  • настройки airflow.cfg?
  • что-то о LDAP-сервере моей организации?
  • что-то еще?

Пожалуйста, дайте мне знать, если я пропустил какую-либо информацию. Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Что ж, к счастью, я понял это и смог ответить на свой собственный вопрос, первый, который до сих пор был дан ответ на SO.

Частично причина в том, что FAB использует пакет python-ldap для обработки ошибок, но есть также пакеты ldap3 и ldap, которые, если вы установили их в определенном порядке, могут мешать с использованием python-ldap.

Я также обнаружил, что python-ldap имеет определенные требования к сборке .

Кроме того, я обнаружил, что в FAB есть еще один параметр LDAP, AUTH_LDAP_SEARCH_FILTER, который позволяет фильтровать возможных пользователей по определенной группе, что именно то, что я хотел, но это не упоминается в документации; Я нашел это в репозитории на GitHub.

Вот мой webserver_config.py файл, который работает для меня:

# -*- coding: utf-8 -*-

import os
from airflow import configuration as conf
from flask_appbuilder.security.manager import AUTH_LDAP
basedir = os.path.abspath(os.path.dirname(__file__))

# The SQLAlchemy connection string.
SQLALCHEMY_DATABASE_URI = conf.get('core', 'SQL_ALCHEMY_CONN')

# Flask-WTF flag for CSRF
CSRF_ENABLED = True

# ------------------------------------------------------------------------------
# AUTHENTICATION CONFIG
# ------------------------------------------------------------------------------
# For details on how to set up each of the following authentications, see
# http://flask-appbuilder.readthedocs.io/en/latest/security.html# authentication-methods

# The authentication type
AUTH_TYPE = AUTH_LDAP

AUTH_ROLE_PUBLIC = "Public"
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = "Viewer"

AUTH_LDAP_SERVER = "ldaps://ldaps.myorg.org:636"
AUTH_LDAP_BIND_USER = "CN=myuser,OU=Service Accounts,DC=myorg,DC=org"
AUTH_LDAP_BIND_PASSWORD = "relevant_password"
AUTH_LDAP_SEARCH = "DC=myorg,DC=org"  # same as BASEDN
AUTH_LDAP_SEARCH_FILTER = "(memberOf=CN=My Team,OU=My Group,DC=myorg,DC=org)"
AUTH_LDAP_UID_FIELD = AUTH_LDAP_UID_FIELD = "sAMAccountName"
AUTH_LDAP_ALLOW_SELF_SIGNED = True
AUTH_LDAP_USE_TLS = False
AUTH_LDAP_TLS_DEMAND = True
AUTH_ROLE_ADMIN = "Admin"

Я установил AUTH_USER_REGISTRATION_ROLE на Viewer, потому что по умолчанию Public не имеет связанных с ним разрешений, поэтому, если кто-то в AD входит в систему и его роль по умолчанию установлена ​​в Public, он не сможет ничего сделать, пока администратор не изменится. их роль.

Я узнал от ИТ в своей организации, что контроллер домена сервера LDAP обрабатывает TLS, поэтому я думаю, что поэтому я могу установить AUTH_LDAP_ALLOW_SELF_SIGNED на True, тогда как у меня нет сертификата TLS в Docker Контейнеры для указания потока воздуха для установки AUTH_LDAP_USE_TLS в True.

0 голосов
/ 10 января 2019

AnonymousUserMixin - класс mixin, определенный в пакете Flask-Login python. Вы, вероятно, столкнулись с проблемой, когда путь к файлу предполагает вошедшего в систему пользователя. Вы можете изменить этот путь кода следующим образом:

if flask_login.current_user.is_authenticated():
    *code*

Возможно, вы захотите добавить пользовательский класс в качестве класса анонимного пользователя в коде конфигурации / настройки приложения Flask.

class MyCustomAnonymousUser(flask_login.AnonymousUserMixin):
    def __init__(self):
        self.roles = []

flask_app = Flask(...)  # some flask app being initialized
flask_app.login_manager.anonymous_user = MyCustomAnonymousUser

Однако возможно также, что код, выдающий эту ошибку, ожидает настройки Flask-Security. Взгляд под капотом того, что Flask-Security делает:

from flask.ext.login import AnonymousUserMixin, UserMixin as BaseUserMixin, \
LoginManager, current_user

...


class AnonymousUser(AnonymousUserMixin):
    """AnonymousUser definition"""

    def __init__(self):
        self.roles = ImmutableList()

    def has_role(self, *args):
        """Returns `False`"""
        return False

Чтобы настроить Flask-Security для своего приложения, ознакомьтесь с кратким описанием их документации: https://pythonhosted.org/Flask-Security/quickstart.html

...