我正在尝试将 Airflow Webserver 身份验证与 Airflow 1.10.0 中提供的 Flask-AppBuilder RBAC 集成,但无论我尝试什么配置设置,都会收到 AttributeError: 'AnonymousUserMixin' object has no attribute '角色'
。
之前,我已经让 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.py
LDAP 设置?- 这些设置两边有引号吗?
airflow.cfg
设置?- 有关我组织的 LDAP 服务器的信息?
- 还有别的事吗?
如果我遗漏了任何信息,请告诉我。谢谢!
最佳答案
好吧,幸运的是我想通了,并且能够回答我自己的问题,这是迄今为止在 SO 上得到回答的第一个问题。
部分原因是 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 服务器的域 Controller 处理 TLS,因此我认为这就是为什么我可以将 AUTH_LDAP_ALLOW_SELF_SIGNED
设置为 True
,而我Docker 容器中没有 TLS 证书来将 Airflow 指向以将 AUTH_LDAP_USE_TLS 设置为 True。
关于python - 将 LDAP 与 Flask-AppBuilder RBAC 结合使用时,Airflow Webserver 中出现“AnonymousUserMixin”对象没有属性 'roles' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54120375/