我正在尝试将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
设置?如果我遗漏了任何信息,请告诉我。谢谢!
答案 0 :(得分:1)
好吧,幸运的是,我弄清楚了,并且能够回答我自己的问题,这是迄今为止到目前为止第一个回答的问题。
部分原因是FAB uses python-ldap
软件包用于错误处理,但是还有ldap3
和ldap
软件包,如果您安装在特定的软件包中,顺序可能会干扰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