FAB 認證管理器認證¶
預設情況下,FAB 認證管理器要求使用者在登入前指定密碼。您可以使用以下 CLI 命令建立帳戶
# create an admin user
airflow users create \
--username admin \
--firstname Peter \
--lastname Parker \
--role Admin \
--email spiderman@superhero.org
要停用認證並允許使用者以匿名使用者身份識別,需要將 $AIRFLOW_HOME/webserver_config.py 檔案中的以下條目設定為匿名使用者預設擁有的所需角色
AUTH_ROLE_PUBLIC = 'Admin'
注意
Airflow 使用 Python 的配置解析器。此配置解析器會解析 ‘%’ 符號。請確保在您的配置檔案中(但不包括環境變數)將任何 % 符號轉義為 %%,否則 Airflow 可能會在配置解析器發生異常時將這些密碼洩露到日誌中。
密碼¶
最簡單的認證機制之一是要求使用者在登入前指定密碼。
請使用命令列介面 airflow users create 建立帳戶,或者在 UI 中進行操作。
其他方法¶
會自動生成一個 webserver_config.py 配置檔案,可用於配置 FAB 認證管理器以支援 OAuth、OpenID、LDAP、REMOTE_USER 等認證方法。需要注意的是,由於 Flask AppBuilder 和 Authlib 的限制,只支援一部分 OAuth2 提供商。此列表包括 github、githublocal、twitter、linkedin、google、azure、openshift、okta、keycloak 和 keycloak_before_17。
預設情況下,使用 $AIRFLOW_HOME/webserver_config.py 中的以下條目。
AUTH_TYPE = AUTH_DB
可以使用 WSGI 中介軟體來管理非常具體的認證形式(例如 SPNEGO),並利用 REMOTE_USER 方法
from typing import Any, Callable
from flask import current_app
from flask_appbuilder.const import AUTH_REMOTE_USER
class CustomMiddleware:
def __init__(self, wsgi_app: Callable) -> None:
self.wsgi_app = wsgi_app
def __call__(self, environ: dict, start_response: Callable) -> Any:
# Custom authenticating logic here
# ...
environ["REMOTE_USER"] = "username"
return self.wsgi_app(environ, start_response)
current_app.wsgi_app = CustomMiddleware(current_app.wsgi_app)
AUTH_TYPE = AUTH_REMOTE_USER
另一種建立使用者的方式是在 UI 登入頁面,透過“註冊”按鈕允許使用者自行註冊。可以編輯 $AIRFLOW_HOME/webserver_config.py 中的以下條目以實現此功能
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = "Desired Role For The Self Registered User"
RECAPTCHA_PRIVATE_KEY = 'private_key'
RECAPTCHA_PUBLIC_KEY = 'public_key'
MAIL_SERVER = 'smtp.gmail.com'
MAIL_USE_TLS = True
MAIL_USERNAME = 'yourappemail@gmail.com'
MAIL_PASSWORD = 'passwordformail'
MAIL_DEFAULT_SENDER = 'sender@gmail.com'
需要透過 pip 安裝 Flask-Mail 包以允許使用者自行註冊,因為這是 Flask-AppBuilder 框架提供的一項功能。
為了支援透過第三方提供商進行認證,需要將 AUTH_TYPE 條目更新為所需的選項,例如 OAuth、OpenID、LDAP,並且需要移除所選選項的引用行的註釋並在 $AIRFLOW_HOME/webserver_config.py 中進行配置。
有關更多詳細資訊,請參閱 FAB 文件的安全性部分。