认证管理器¶
认证(用于身份验证/授权)管理器是 Airflow 中处理用户身份验证和用户授权的组件。它们具有通用的 API 并且是“可插拔的”,这意味着您可以根据您的安装需求交换认证管理器。
Airflow 一次只能配置一个认证管理器;这通过 auth_manager
选项在 配置文件的 [core]
部分中设置。
注意
有关 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 参考 中。这些端点可用于管理由您的身份验证管理器处理的资源,例如用户、组、角色(如果有)。端点仅为当前配置的身份验证管理器提供。