Airflow Summit 2025 即将到来,时间是10月07-09日。立即注册以获取早鸟票!

权限管理器

权限(用于认证/授权)管理器是 Airflow 中处理用户认证和用户授权的组件。它们具有通用的 API,并且是“可插拔”的,这意味着你可以根据安装需求更换权限管理器。

../../_images/diagram_auth_manager_airflow_architecture.png

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。

命令行界面 (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

注意

有关 Airflow 配置的更多信息,请参阅 设置配置选项;有关管理 Airflow 中 Python 模块的更多信息,请参阅 模块管理

此条目是否有帮助?