許可權管理器¶
許可權(用於認證/授權)管理器是 Airflow 中處理使用者認證和使用者授權的元件。它們具有通用的 API,並且是“可插拔”的,這意味著你可以根據安裝需求更換許可權管理器。
Airflow 一次只能配置一個許可權管理器;這透過 配置檔案 的 [core] 部分中的 auth_manager 選項來設定。
注意
有關 Airflow 配置的更多資訊,請參閱設定配置選項。
如果你想檢查當前設定了哪個許可權管理器,可以使用 airflow config get-value core auth_manager 命令
$ airflow config get-value core auth_manager
airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager
可用的許可權管理器¶
以下是你可以在 Airflow 環境中使用的現有許可權管理器列表。
Airflow 提供
提供者提供
為何需要可插拔的許可權管理器?¶
Airflow 被許多不同配置的不同使用者使用。一些 Airflow 環境可能僅由一個使用者使用,而另一些可能由數千使用者使用。一個僅有一個(或很少)使用者的 Airflow 環境不需要像由數千使用者使用的環境那樣的使用者管理。
這就是為什麼整個使用者管理(使用者認證和使用者授權)被打包在一個名為許可權管理器的元件中。這樣就可以輕鬆地即插即用適合你特定需求的許可權管理器。
預設情況下,Airflow 附帶 Flask AppBuilder (FAB) 許可權管理器。
注意
切換到不同的許可權管理器是一項重大操作,應認真對待。它將影響環境的使用者。如果使用者未被告知,登入和退出體驗很可能會發生變化並打擾他們。此外,所有當前使用者和許可權都必須從先前的許可權管理器複製到新的許可權管理器。
編寫自定義許可權管理器¶
所有 Airflow 許可權管理器都實現了一個通用介面,使其可插拔,並且任何許可權管理器都可以訪問 Airflow 中的所有能力和整合。此介面在整個 Airflow 中用於執行所有與使用者認證和使用者授權相關的操作。
公共介面是 BaseAuthManager。你可以檢視程式碼以獲取最詳細和最新的介面,但下面概述了一些重要的亮點。
注意
有關 Airflow 公共介面的更多資訊,請參閱 Airflow 的公共介面。
你可能想要編寫自定義許可權管理器的一些原因包括:
沒有現有的許可權管理器適合你的特定用例,例如用於使用者管理的特定工具或服務。
你希望使用一個利用你首選雲提供商的身份提供者的許可權管理器。
你有一個僅對你或你的組織可用的私有使用者管理工具。
許可權管理器對 JWT token 的管理¶
許可權管理器負責建立與 Airflow 公共 API 互動所需的 JWT token。為了實現這一點,許可權管理器**必須**提供一個建立此 JWT token 的端點。此端點必須可透過 POST /auth/token 訪問
許可權管理器還負責將 JWT token 傳遞給 Airflow UI。許可權管理器和 Airflow UI 之間交換 JWT token 的協議使用 cookie。許可權管理器需要在重定向到 Airflow UI 之前將 JWT token 儲存到名為 _token 的 cookie 中。然後 Airflow UI 將讀取此 cookie,儲存它並刪除該 cookie。
from airflow.api_fastapi.auth.managers.base_auth_manager import COOKIE_NAME_JWT_TOKEN
response = RedirectResponse(url="/")
secure = bool(conf.get("api", "ssl_cert", fallback=""))
response.set_cookie(COOKIE_NAME_JWT_TOKEN, token, secure=secure)
return response
注意
不要將 cookie 引數 httponly 設定為 True。Airflow UI 需要從 cookie 訪問 JWT token。
推薦覆蓋的可選方法(用於最佳化)¶
以下方法不是擁有一個功能性 Airflow 許可權管理器所必須覆蓋的。然而,建議覆蓋這些方法以使你的許可權管理器更快(並且可能成本更低)
batch_is_authorized_dag:is_authorized_dag的批次版本。如果未覆蓋,它將為每個單獨項呼叫is_authorized_dag。batch_is_authorized_connection:is_authorized_connection的批次版本。如果未覆蓋,它將為每個單獨項呼叫is_authorized_connection。batch_is_authorized_pool:is_authorized_pool的批次版本。如果未覆蓋,它將為每個單獨項呼叫is_authorized_pool。batch_is_authorized_variable:is_authorized_variable的批次版本。如果未覆蓋,它將為每個單獨項呼叫is_authorized_variable。get_authorized_dag_ids:返回使用者有權訪問的 DAG ID 列表。如果未覆蓋,它將為環境中可用的每個 DAG 呼叫is_authorized_dag。
命令列介面 (CLI)¶
許可權管理器可以透過實現 get_cli_commands 方法來提供 CLI 命令,這些命令將包含在 airflow 命令列工具中。這些命令可用於設定所需的資源。命令僅提供給當前配置的許可權管理器。以下是實現許可權管理器提供 CLI 命令的虛擬碼示例:
@staticmethod
def get_cli_commands() -> list[CLICommand]:
sub_commands = [
ActionCommand(
name="command_name",
help="Description of what this specific command does",
func=lazy_load_command("path.to.python.function.for.command"),
args=(),
),
]
return [
GroupCommand(
name="my_cool_auth_manager",
help="Description of what this group of commands do",
subcommands=sub_commands,
),
]
注意
目前,Airflow 命令名稱空間沒有嚴格的規則。開發者有責任為其 CLI 命令使用足夠獨特的名稱,以免與其他 Airflow 元件發生衝突。
注意
在建立新的許可權管理器或更新任何現有許可權管理器時,請務必不要在模組級別匯入或執行任何耗時的操作/程式碼。許可權管理器類在多個地方被匯入,如果它們匯入速度慢,將對你的 Airflow 環境的效能產生負面影響,特別是對於 CLI 命令。
擴充套件 API 伺服器應用¶
許可權管理器可以選擇擴充套件 Airflow API 伺服器。這樣做可以(例如)提供額外的公共 API 端點。要擴充套件 API 伺服器應用,你需要實現 get_fastapi_app 方法。這些額外的端點可用於管理由你的許可權管理器處理的資源,例如使用者、組、角色(如果有)。透過 get_fastapi_app 定義的端點將被掛載到 /auth。
下一步¶
一旦你建立了一個實現了 BaseAuthManager 介面的新許可權管理器類,你可以透過將 core.auth_manager 配置值設定為你的許可權管理器的模組路徑來配置 Airflow 使用它
[core]
auth_manager = my_company.auth_managers.MyCustomAuthManager