1

我正在尝试将 Airflow Webserver 身份验证与 Airflow 1.10.0 中可用的 Flask-AppBuilder RBAC 集成,但无论我尝试什么配置设置,我都会得到一个AttributeError: 'AnonymousUserMixin' object has no attribute 'roles'.

以前,我已经让 Airflow LDAP 身份验证后端与我的组织的 LDAP Microsoft 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 DB,以便它拥有ab_表格。

当我通过 Docker Swarm 部署所有内容并转到相应的 Web 服务器 URL 时,我只会收到上面列出的错误以及堆栈跟踪。它从来没有给我登录选项(我尝试清除 cookie),所以我不明白如何让它让“匿名”用户甚至尝试对 LDAP AD 进行身份验证。

是问题

  • webserver_config.pyLDAP 设置?
  • 这些设置周围的引号?
  • 设置airflow.cfg
  • 关于我的组织的 LDAP 服务器?
  • 别的东西?

如果我遗漏了任何信息,请告诉我。谢谢!

4

2 回答 2

2

好吧,幸运的是,我想通了并且能够回答我自己的问题,这是迄今为止在 SO 上回答的第一个问题。

部分原因是FAB 使用python-ldap包进行错误处理,但也有ldap3ldap包,如果您以特定顺序安装它们可能会干扰python-ldap.

我还发现python-ldap有一定的构建要求

此外,我发现 FAB 有另一个 LDAP 参数,AUTH_LDAP_SEARCH_FILTER它可以让您将可能的用户过滤到某个组,这正是我想要的,但文档中没有提到它;我在 GitHub 上的包 repo 中找到了它。

这是对我有用的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为查看者,因为默认情况下 Public 没有与之关联的权限,因此如果 AD 中的某人登录并且他们的角色默认为 Public,那么在管理员更改其角色之前,他们将无法执行任何操作。

我在我的组织中从 IT 了解到 LDAP 服务器的域控制器处理 TLS,所以我认为这就是为什么我可以设置AUTH_LDAP_ALLOW_SELF_SIGNEDTrue,而我在 Docker 容器中没有 TLS 证书来指向 Airflow 以便设置AUTH_LDAP_USE_TLS为真。

于 2019-01-19T20:23:24.130 回答
0

AnonymousUserMixin是在Flask-Loginpython 包中定义的 mixin 类。您可能会遇到代码路径假定已登录用户的问题。您可以将该代码路径更改为如下所示:

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

于 2019-01-10T01:27:12.780 回答