认证管理器¶
Auth(用于认证/授权)管理器是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环境所需的用户管理机制,与拥有数千用户的环境截然不同。
这就是为什么整个用户管理(用户认证和用户授权)被打包在一个名为auth manager的组件中。这样就能轻松地即插即用适合您特定需求的认证管理器。
默认情况下,Airflow内置了Flask AppBuilder (FAB) 认证管理器。
注意
切换到不同的认证管理器是一项重大操作,应慎重考虑。这将影响环境中的用户。如果未提前告知用户,登录和注销体验很可能会发生变化并造成困扰。此外,所有现有用户和权限都必须从之前的认证管理器迁移到新的认证管理器。
编写您自己的认证管理器¶
所有Airflow认证管理器都实现了一个通用接口,使其具有可插拔性,任何认证管理器都能访问Airflow内的所有功能和集成。该接口在Airflow中被广泛用于执行所有与用户认证和用户授权相关的操作。
公共接口是BaseAuthManager。
您可以通过代码查看最详细和最新的接口,但下面概述了一些重要亮点。
注意
有关Airflow公共接口的更多信息,请参阅Public Interface of 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参考文档中。这些端点可用于管理由您的认证管理器处理的资源,例如用户、组、角色(如果有)。端点仅针对当前配置的认证管理器提供。
下一步¶
一旦你创建了一个实现BaseAuthManager接口的新认证管理类,就可以通过将core.auth_manager配置值设置为你的认证管理器的模块路径,来配置Airflow使用它:
[core]
auth_manager = my_company.auth_managers.MyCustomAuthManager