python - 将 LDAP 与 Flask-AppBuilder RBAC 结合使用时,Airflow Webserver 中出现“AnonymousUserMixin”对象没有属性 'roles' 错误

标签 python ldap airflow rbac flask-appbuilder

我正在尝试将 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 软件包,但还有 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 服务器的域 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/

相关文章:

python - 框架 argparse - 检查是否设置了标志

java - 如何以编程方式将用户帐户添加到 openDS?

python - 使用XCom在类之间交换数据?

active-directory - Active Directory LDAP 查询结果总是缺少已知存在的属性

docker - 无法在 Airflow DockerOperator 中运行脚本

python - 无法找到通过环境变量设置 Airflow 连接的凭据

Python pandas 部分折叠二维矩阵

python - 如何使用 python 平滑这些信号轨迹?

python - 仅当 x 后面有数字时才替换它

java - 检查 LDAP 连接 (Java)