如何为Airflow配置LDAP优先、DB后备的双重认证?
Airflow 配置LDAP优先+DB Fallback的双重认证方案
你之前尝试的两种方法之所以无效,原因如下:
- Flask-AppBuilder(FAB)的
AUTH_TYPE仅支持单个常量值,不接受列表形式的多类型配置 airflow.cfg中的auth_backend同样只允许配置单个认证后端路径,多值配置无法被解析
要实现优先LDAP认证,失败后自动 fallback 到Airflow DB认证,需要通过自定义安全管理器来实现,具体步骤如下:
1. 编写自定义安全管理器
在Airflow的webserver_config.py文件中添加以下代码,继承Airflow默认的安全管理器并改写认证逻辑:
from flask_appbuilder.security.manager import AUTH_LDAP from airflow.www.fab_security.manager import AirflowSecurityManager class HybridSecurityManager(AirflowSecurityManager): def authenticate(self, username, password): # 优先执行LDAP认证 try: ldap_authenticated_user = super().authenticate(username, password) if ldap_authenticated_user: return ldap_authenticated_user except Exception: # LDAP认证失败(用户不存在/密码错误/连接异常),进入DB认证流程 pass # 执行Airflow DB认证逻辑 db_user = self.find_user(username=username) if db_user and self._check_password(db_user, password): return db_user # 两种认证均失败,返回None return None # 指定使用自定义安全管理器 CUSTOM_SECURITY_MANAGER = HybridSecurityManager # 配置LDAP基础参数(根据你的实际环境修改) AUTH_TYPE = AUTH_LDAP AUTH_LDAP_SERVER = "ldap://your-ldap-host:389" AUTH_LDAP_BIND_USER = "cn=bind-user,dc=example,dc=com" AUTH_LDAP_BIND_PASSWORD = "bind-password" AUTH_LDAP_SEARCH = "ou=users,dc=example,dc=com" AUTH_LDAP_UID_FIELD = "uid" AUTH_LDAP_USE_TLS = False
2. 关键说明
- 确保LDAP的基础配置参数与你的实际LDAP服务器匹配,否则LDAP认证会直接触发异常并进入DB流程
- DB认证依赖Airflow默认的用户表,需要提前通过
airflow users create命令在airflow_db中创建对应的用户账号 - 该方案适配Airflow 2.x版本,若使用1.x版本,需调整继承的安全管理器类(改为
SecurityManager而非AirflowSecurityManager) - 异常捕获逻辑可根据需求细化,比如仅捕获“用户不存在”类异常,避免因LDAP服务器连接失败直接跳转到DB认证
内容的提问来源于stack exchange,提问作者Pavel Popov
相关产品推荐
相关产品推荐

