将LDAP与Flask-AppBuilder RBAC一起使用时,Airflow Web服务器中的'AnonymousUserMixin'对象没有属性'roles'错误

时间:2019-01-10 00:22:08

标签: python ldap airflow rbac flask-appbuilder

我正在尝试将Airflow Web服务器身份验证与Airflow 1.10.0中可用的Flask-AppBuilder RBAC集成在一起,但是无论我尝试使用哪种配置设置,我都会得到一个AttributeError: 'AnonymousUserMixin' object has no attribute 'roles'

以前,我已经获得了Airflow LDAP身份验证后端以与组织的LDAP Microsoft AD服务器一起使用,但是我无法正确地进行配置设置以使其能够与FAB RBAC一起使用。关于LDAP或对其进行故障排除,Airflow和FAB文档很少说。

我在${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.py LDAP设置?
  • 这些设置周围的引号?
  • airflow.cfg设置?
  • 有关我的组织机构的LDAP服务器的信息?
  • 还有别的吗?

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

2 个答案:

答案 0 :(得分:1)

好吧,幸运的是,我弄清楚了,并且能够回答我自己的问题,这是迄今为止到目前为止第一个回答的问题。

部分原因是FAB uses python-ldap软件包用于错误处理,但是还有ldap3ldap软件包,如果您安装在特定的软件包中,顺序可能会干扰python-ldap的使用。

我还发现python-ldap具有某些build requirements

此外,我发现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,他们将无法执行任何操作。管理员更改了他们的角色。

我从组织的IT部门了解到LDAP服务器的域控制器可以处理TLS,所以我认为这就是为什么我可以将AUTH_LDAP_ALLOW_SELF_SIGNED设置为True的原因,而我却没有TLS将Docker容器中的证书指向Airflow以便将AUTH_LDAP_USE_TLS设置为True。

答案 1 :(得分:0)

AnonymousUserMixin是在Flask-Login python包中定义的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