身份验证管理器¶
身份验证(用于身份验证/授权)管理器是 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 附带 Flask AppBuilder (FAB) 身份验证管理器。
注意
切换到不同的身份验证管理器是一项繁重的操作,应将其视为一项重要操作。这将影响环境的用户。如果没有提前告知,登录和注销体验很可能会发生变化并打扰他们。此外,所有当前用户和权限都必须从之前的身份验证管理器复制到下一个身份验证管理器。
编写您自己的身份验证管理器¶
所有 Airflow 身份验证管理器都实现了一个通用接口,以便它们是可插拔的,并且任何身份验证管理器都可以访问 Airflow 中的所有功能和集成。此接口在 Airflow 中使用,以执行所有与用户身份验证和用户授权相关的操作。
公共接口是 BaseAuthManager
。您可以查看代码以获取最详细和最新的接口,但下面概述了一些重要的亮点。
注意
有关 Airflow 公共接口的更多信息,请参阅 Airflow 的公共接口。
您可能想要编写自定义身份验证管理器的一些原因包括
不存在适合您特定用例的身份验证管理器,例如用于用户管理的特定工具或服务。
您想使用一个身份验证管理器,该管理器利用您首选云提供商的身份提供程序。
您有一个私有的用户管理工具,只有您或您的组织可以使用。
建议重写以进行优化的可选方法¶
以下方法不需要重写即可拥有功能正常的 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_permitted_dag_ids
:返回用户有权访问的 DAG ID 列表。如果未重写,它将为环境中可用的每个 DAG 调用is_authorized_dag
。filter_permitted_menu_items
:返回用户有权访问的菜单项。如果未重写,它将为每个菜单项调用AirflowSecurityManagerV2
中的has_access
。
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 命令。
REST API¶
身份验证管理器可以通过实现 get_api_endpoints
方法来提供 REST API 端点,这些端点将包含在 REST API 参考 中。这些端点可用于管理由身份验证管理器处理的资源,例如用户、组、角色(如果有)。端点仅针对当前配置的身份验证管理器提供。