apache-airflow-providers-fab 3.0.1rc1__tar.gz → 3.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- apache_airflow_providers_fab-3.2.0/.pre-commit-config.yaml +60 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/3rd-party-licenses/LICENSES-ui.txt +1 -1
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/NOTICE +1 -1
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/PKG-INFO +15 -14
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/README.rst +6 -6
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/access-control.rst +1 -1
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/api-authentication.rst +3 -3
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/configuring-flask-app.rst +1 -1
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/sso.rst +30 -4
- apache_airflow_providers_fab-3.2.0/docs/auth-manager/token.rst +155 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/webserver-authentication.rst +83 -1
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/changelog.rst +181 -3
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/cli-ref.rst +1 -1
- apache_airflow_providers_fab-3.2.0/docs/img/azure-ad-authentication.jpeg +0 -0
- apache_airflow_providers_fab-3.2.0/docs/img/azure-ad-token-claims.jpeg +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/index.rst +6 -6
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/provider.yaml +17 -2
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/pyproject.toml +10 -11
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/__init__.py +1 -1
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_endpoints/user_endpoint.py +5 -3
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/datamodels/login.py +0 -7
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/datamodels/roles.py +69 -0
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/datamodels/users.py +68 -0
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/openapi/v2-fab-auth-manager-generated.yaml +1020 -0
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/parameters.py +55 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/routes/login.py +36 -6
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/routes/roles.py +137 -0
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/routes/users.py +133 -0
- apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/auth_manager/api_fastapi/conftest.py → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/security.py +10 -10
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/services/login.py +13 -27
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/services/roles.py +158 -0
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/services/users.py +219 -0
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/sorting.py +49 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/db_command.py +2 -2
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/permissions_command.py +6 -2
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/user_command.py +3 -3
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/fab_auth_manager.py +50 -53
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/models/__init__.py +9 -14
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/models/db.py +1 -1
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/security_manager/override.py +145 -89
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/user.py +12 -0
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/cli/__init__.py +18 -0
- {apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/auth_manager/cli_commands → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/cli}/definition.py +50 -2
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/get_provider_info.py +8 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/version_compat.py +1 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/api_connexion/parameters.py +1 -46
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/app.py +6 -8
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_appbuilder.py +8 -4
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_security.py +1 -1
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_views.py +11 -7
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/package-lock.json +972 -682
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/package.json +14 -11
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/session.py +5 -8
- apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/743.935ed3d26e56ed8f63d3.js → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/743.8fb7d21632ed892227fe.js +2 -2
- apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.ff5a35f322070b094aa2.js → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.51e5d14856ee1ebc83ca.js +1 -1
- apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/flash.5583a9e0cf11f2be93da.js → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/flash.865b6940c00b2a9041b3.js +1 -1
- apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/loadingDots.2e5f555f0753107b0300.js → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/loadingDots.07f5b9805847242736e1.js +1 -1
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/main.8cffe40bcf7cca998f4e.js +2 -0
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/manifest.json +22 -0
- apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/materialIcons.3e67dd6fbfcc4f3b5105.js → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/materialIcons.4fe84ae36604d84dec78.js +1 -1
- apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/moment.0ec3ee3fb60dc999b1fd.js +1 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/js/main.js +11 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/airflow/main.html +1 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/views.py +18 -14
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/test_role_and_permission_endpoint.py +11 -11
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/test_user_endpoint.py +5 -5
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/conftest.py +70 -0
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/datamodels/test_roles.py +130 -0
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/datamodels/test_users.py +234 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_fastapi/routes/test_login.py +13 -4
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/routes/test_roles.py +554 -0
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/routes/test_users.py +582 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_fastapi/services/test_login.py +22 -42
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/services/test_roles.py +363 -0
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/services/test_users.py +462 -0
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/test_parameters.py +70 -0
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/test_security.py +50 -0
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/test_sorting.py +69 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_db_command.py +18 -16
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_permissions_command.py +3 -3
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_role_command.py +2 -2
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_user_command.py +6 -6
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/models/test_user_model.py +3 -6
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/security_manager/test_override.py +1 -1
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/test_fab_auth_manager.py +80 -16
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/test_security.py +23 -13
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/cli/__init__.py +16 -0
- {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/auth_manager/cli_commands → apache_airflow_providers_fab-3.2.0/tests/unit/fab/cli}/test_definition.py +1 -1
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/db_manager/__init__.py +16 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/db_manager/test_fab_db_manager.py +1 -1
- apache_airflow_providers_fab-3.2.0/tests/unit/fab/plugins/__init__.py +16 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/plugins/test_plugin.py +1 -1
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/test_auth.py +2 -2
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/views/test_views_custom_user_views.py +39 -3
- apache_airflow_providers_fab-3.2.0/www-hash.txt +1 -0
- apache_airflow_providers_fab-3.0.1rc1/docs/auth-manager/token.rst +0 -45
- apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/auth_manager/api_fastapi/openapi/v2-fab-auth-manager-generated.yaml +0 -153
- apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/main.3cf3be1a0c5439bb640d.js +0 -2
- apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/manifest.json +0 -22
- apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/moment.9baee5ec3d7639a10897.js +0 -1
- apache_airflow_providers_fab-3.0.1rc1/www-hash.txt +0 -1
- {apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab → apache_airflow_providers_fab-3.2.0}/LICENSE +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/api-ref/fab-public-api-ref.rst +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/api-ref/fab-token-api-ref.rst +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/index.rst +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/security.rst +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/commits.rst +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/conf.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/configurations-ref.rst +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/img/add-role.png +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/img/diagram_fab_auth_manager_airflow_architecture.md5sum +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/img/diagram_fab_auth_manager_airflow_architecture.png +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/img/diagram_fab_auth_manager_airflow_architecture.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/img/new-role.png +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/installing-providers-from-sources.rst +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/migrations-ref.rst +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/security.rst +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/upgrading.rst +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/3rd-party-licenses/LICENSES-ui.txt +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/alembic.ini +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/auth/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/auth/backend/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/auth/backend/basic_auth.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/auth/backend/kerberos_auth.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/auth/backend/session.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_endpoints/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_endpoints/role_and_permission_endpoint.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/datamodels/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/openapi/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/routes/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/services/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/role_command.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/sync_perm_command.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/utils.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/models/anonymous_user.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/openapi/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/openapi/v1-flask-api.yaml +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/schemas/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/schemas/role_and_permission_schema.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/schemas/user_schema.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/security_manager/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/security_manager/constants.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/permissions.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/roles_list.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/user_edit.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/user_stats.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/migrations/README +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/migrations/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/migrations/env.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/migrations/script.py.mako +0 -0
- /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/migrations/versions/0001_1_4_0_create_ab_tables_if_missing.py → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/migrations/versions/0000_1_4_0_create_ab_tables_if_missing.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/migrations/versions/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/airflow_flask_app.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/api_connexion/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/api_connexion/exceptions.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/api_connexion/security.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/api_connexion/types.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/auth.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/constants.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_jinja_globals.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_manifest_files.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_session.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_wsgi_middlewares.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/security/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/security/permissions.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/security_appless.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/security_manager.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/css/bootstrap-theme.css +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/css/flash.css +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/css/loading-dots.css +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/css/main.css +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/css/material-icons.css +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/48f0ea180c40270a5b05.png +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/649c0b07771e68fafdeb.png +0 -0
- /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/743.935ed3d26e56ed8f63d3.js.LICENSE.txt → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/743.8fb7d21632ed892227fe.js.LICENSE.txt +0 -0
- /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.ff5a35f322070b094aa2.css → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.51e5d14856ee1ebc83ca.css +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/f7490d556a6c42e49ba4.png +0 -0
- /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/flash.5583a9e0cf11f2be93da.css → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/flash.865b6940c00b2a9041b3.css +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/jquery-ui.min.css +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/jquery-ui.min.js +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/jquery-ui.min.js.LICENSE.txt +0 -0
- /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/loadingDots.2e5f555f0753107b0300.css → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/loadingDots.07f5b9805847242736e1.css +0 -0
- /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/main.3cf3be1a0c5439bb640d.css → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/main.8cffe40bcf7cca998f4e.css +0 -0
- /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/main.3cf3be1a0c5439bb640d.js.LICENSE.txt → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/main.8cffe40bcf7cca998f4e.js.LICENSE.txt +0 -0
- /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/materialIcons.3e67dd6fbfcc4f3b5105.css → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/materialIcons.4fe84ae36604d84dec78.css +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/oss-licenses.json +0 -0
- /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/runtime.6ad9da077ea169d60db9.js → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/runtime.45b36fb8335446865b53.js +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/js/datetime_utils.js +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/pin_100.png +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/pin_32.png +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/sort_asc.png +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/sort_both.png +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/sort_desc.png +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/airflow/_messages.html +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/airflow/error.html +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/airflow/traceback.html +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/appbuilder/flash.html +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/appbuilder/index.html +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/appbuilder/navbar.html +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/appbuilder/navbar_menu.html +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/appbuilder/navbar_right.html +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/utils.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/webpack.config.js +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/conftest.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/auth/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/auth/backend/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/auth/backend/test_basic_auth.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/auth/backend/test_kerberos_auth.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/auth/backend/test_session.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/api_connexion_utils.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/remote_user_api_auth_backend.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/test_auth.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_fastapi/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/auth_manager/api_fastapi/routes → apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/datamodels}/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/auth_manager/cli_commands → apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/routes}/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_fastapi/services/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/auth_manager/security_manager → apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/cli}/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/db_manager → apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/cli_commands}/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_sync_perm_command.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_utils.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/conftest.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/models/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/models/test_anonymous_user.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/models/test_db.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/schemas/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/schemas/test_role_and_permission_schema.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/schemas/test_user_schema.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/plugins → apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/security_manager}/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/security_manager/test_constants.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/test_models.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/test_permissions.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/test_roles_list.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/test_user.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/test_user_edit.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/test_user_stats.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/decorators.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/plugins/conftest.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/utils.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/test_utils.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/views/__init__.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/views/conftest.py +0 -0
- {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/views/test_connection_form_fields.py +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
|
3
|
+
# distributed with this work for additional information
|
|
4
|
+
# regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
|
6
|
+
# "License"); you may not use this file except in compliance
|
|
7
|
+
# with the License. You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
|
12
|
+
# software distributed under the License is distributed on an
|
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
# KIND, either express or implied. See the License for the
|
|
15
|
+
# specific language governing permissions and limitations
|
|
16
|
+
# under the License.
|
|
17
|
+
---
|
|
18
|
+
default_stages: [pre-commit, pre-push]
|
|
19
|
+
minimum_prek_version: '0.2.0'
|
|
20
|
+
default_language_version:
|
|
21
|
+
python: python3
|
|
22
|
+
node: 22.19.0
|
|
23
|
+
golang: 1.24.0
|
|
24
|
+
repos:
|
|
25
|
+
- repo: local
|
|
26
|
+
hooks:
|
|
27
|
+
- id: compile-fab-assets
|
|
28
|
+
name: Compile FAB provider assets
|
|
29
|
+
language: node
|
|
30
|
+
files: ^src/airflow/providers/fab/www/
|
|
31
|
+
exclude: |
|
|
32
|
+
(?x)
|
|
33
|
+
^src/airflow/providers/fab/www/api_connexion/.*|
|
|
34
|
+
^src/airflow/providers/fab/www/extensions/.*|
|
|
35
|
+
^src/airflow/providers/fab/www/security/.*
|
|
36
|
+
entry: ../../scripts/ci/prek/compile_provider_assets.py fab
|
|
37
|
+
pass_filenames: false
|
|
38
|
+
additional_dependencies: ['yarn@1.22.21']
|
|
39
|
+
- id: generate-openapi-spec-fab
|
|
40
|
+
name: Generate the FastAPI API spec for FAB
|
|
41
|
+
language: python
|
|
42
|
+
entry: ../../scripts/ci/prek/generate_openapi_spec_providers.py fab
|
|
43
|
+
pass_filenames: false
|
|
44
|
+
files: ^src/airflow/providers/fab/auth_manager/api_fastapi/.*\.py$
|
|
45
|
+
- id: check-revision-heads-map-fab
|
|
46
|
+
name: Check that the REVISION_HEADS_MAP is up-to-date
|
|
47
|
+
language: python
|
|
48
|
+
entry: ../../scripts/ci/prek/check_revision_heads_map.py
|
|
49
|
+
pass_filenames: false
|
|
50
|
+
files: >
|
|
51
|
+
(?x)
|
|
52
|
+
^src/airflow/providers/fab/migrations/versions/.*$|
|
|
53
|
+
^src/airflow/providers/fab/migrations/versions|
|
|
54
|
+
^src/airflow/providers/fab/auth_manager/models/db\.py$
|
|
55
|
+
- id: prevent-deprecated-sqlalchemy-usage-fab
|
|
56
|
+
name: Prevent deprecated sqlalchemy usage
|
|
57
|
+
entry: ../../scripts/ci/prek/prevent_deprecated_sqlalchemy_usage.py
|
|
58
|
+
language: python
|
|
59
|
+
files: ^.*\.py$
|
|
60
|
+
pass_filenames: true
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apache-airflow-providers-fab
|
|
3
|
-
Version: 3.0
|
|
3
|
+
Version: 3.2.0
|
|
4
4
|
Summary: Provider package apache-airflow-providers-fab for Apache Airflow
|
|
5
5
|
Keywords: airflow-provider,fab,airflow,integration
|
|
6
6
|
Author-email: Apache Software Foundation <dev@airflow.apache.org>
|
|
7
7
|
Maintainer-email: Apache Software Foundation <dev@airflow.apache.org>
|
|
8
8
|
Requires-Python: >=3.10,!=3.13
|
|
9
9
|
Description-Content-Type: text/x-rst
|
|
10
|
+
License-Expression: Apache-2.0
|
|
10
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
12
|
Classifier: Environment :: Console
|
|
12
13
|
Classifier: Environment :: Web Environment
|
|
@@ -14,33 +15,33 @@ Classifier: Intended Audience :: Developers
|
|
|
14
15
|
Classifier: Intended Audience :: System Administrators
|
|
15
16
|
Classifier: Framework :: Apache Airflow
|
|
16
17
|
Classifier: Framework :: Apache Airflow :: Provider
|
|
17
|
-
Classifier: License :: OSI Approved :: Apache Software License
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.10
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
20
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
21
21
|
Classifier: Topic :: System :: Monitoring
|
|
22
22
|
License-File: 3rd-party-licenses/LICENSES-ui.txt
|
|
23
|
+
License-File: LICENSE
|
|
23
24
|
License-File: NOTICE
|
|
24
|
-
Requires-Dist: apache-airflow>=3.0.
|
|
25
|
-
Requires-Dist: apache-airflow-providers-common-compat>=1.
|
|
25
|
+
Requires-Dist: apache-airflow>=3.0.2
|
|
26
|
+
Requires-Dist: apache-airflow-providers-common-compat>=1.12.0
|
|
26
27
|
Requires-Dist: blinker>=1.6.2; python_version < '3.13'
|
|
27
28
|
Requires-Dist: flask>=2.2.1,<2.3; python_version < '3.13'
|
|
28
|
-
Requires-Dist: flask-appbuilder==5.0.
|
|
29
|
+
Requires-Dist: flask-appbuilder==5.0.1; python_version < '3.13'
|
|
29
30
|
Requires-Dist: flask-login>=0.6.2; python_version < '3.13'
|
|
30
31
|
Requires-Dist: flask-session>=0.8.0; python_version < '3.13'
|
|
31
32
|
Requires-Dist: msgpack>=1.0.0; python_version < '3.13'
|
|
32
33
|
Requires-Dist: flask-sqlalchemy>=3.0.5; python_version < '3.13'
|
|
33
|
-
Requires-Dist: sqlalchemy<2; python_version < '3.13'
|
|
34
34
|
Requires-Dist: flask-wtf>=1.1.0; python_version < '3.13'
|
|
35
35
|
Requires-Dist: connexion[flask]>=2.14.2,<3.0; python_version < '3.13'
|
|
36
36
|
Requires-Dist: jmespath>=0.7.0; python_version < '3.13'
|
|
37
37
|
Requires-Dist: werkzeug>=2.2,<4; python_version < '3.13'
|
|
38
38
|
Requires-Dist: wtforms>=3.0,<4; python_version < '3.13'
|
|
39
|
+
Requires-Dist: cachetools>=6.0; python_version < '3.13'
|
|
39
40
|
Requires-Dist: flask_limiter>3,<4,!=3.13
|
|
40
41
|
Requires-Dist: kerberos>=1.3.0 ; extra == "kerberos" and ( python_version < '3.13')
|
|
41
42
|
Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
|
|
42
|
-
Project-URL: Changelog, https://airflow.
|
|
43
|
-
Project-URL: Documentation, https://airflow.
|
|
43
|
+
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0/changelog.html
|
|
44
|
+
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0
|
|
44
45
|
Project-URL: Mastodon, https://fosstodon.org/@airflow
|
|
45
46
|
Project-URL: Slack Chat, https://s.apache.org/airflow-slack
|
|
46
47
|
Project-URL: Source Code, https://github.com/apache/airflow
|
|
@@ -72,7 +73,7 @@ Provides-Extra: kerberos
|
|
|
72
73
|
|
|
73
74
|
Package ``apache-airflow-providers-fab``
|
|
74
75
|
|
|
75
|
-
Release: ``3.0
|
|
76
|
+
Release: ``3.2.0``
|
|
76
77
|
|
|
77
78
|
|
|
78
79
|
`Flask App Builder <https://flask-appbuilder.readthedocs.io/>`__
|
|
@@ -85,7 +86,7 @@ This is a provider package for ``fab`` provider. All classes for this provider p
|
|
|
85
86
|
are in ``airflow.providers.fab`` python package.
|
|
86
87
|
|
|
87
88
|
You can find package information and changelog for the provider
|
|
88
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.0
|
|
89
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0/>`_.
|
|
89
90
|
|
|
90
91
|
Installation
|
|
91
92
|
------------
|
|
@@ -103,20 +104,20 @@ Requirements
|
|
|
103
104
|
PIP package Version required
|
|
104
105
|
========================================== ==========================================
|
|
105
106
|
``apache-airflow`` ``>=3.0.2``
|
|
106
|
-
``apache-airflow-providers-common-compat`` ``>=1.
|
|
107
|
+
``apache-airflow-providers-common-compat`` ``>=1.12.0``
|
|
107
108
|
``blinker`` ``>=1.6.2; python_version < "3.13"``
|
|
108
109
|
``flask`` ``>=2.2.1,<2.3; python_version < "3.13"``
|
|
109
|
-
``flask-appbuilder`` ``==5.0.
|
|
110
|
+
``flask-appbuilder`` ``==5.0.1; python_version < "3.13"``
|
|
110
111
|
``flask-login`` ``>=0.6.2; python_version < "3.13"``
|
|
111
112
|
``flask-session`` ``>=0.8.0; python_version < "3.13"``
|
|
112
113
|
``msgpack`` ``>=1.0.0; python_version < "3.13"``
|
|
113
114
|
``flask-sqlalchemy`` ``>=3.0.5; python_version < "3.13"``
|
|
114
|
-
``sqlalchemy`` ``<2; python_version < "3.13"``
|
|
115
115
|
``flask-wtf`` ``>=1.1.0; python_version < "3.13"``
|
|
116
116
|
``connexion[flask]`` ``>=2.14.2,<3.0; python_version < "3.13"``
|
|
117
117
|
``jmespath`` ``>=0.7.0; python_version < "3.13"``
|
|
118
118
|
``werkzeug`` ``>=2.2,<4; python_version < "3.13"``
|
|
119
119
|
``wtforms`` ``>=3.0,<4; python_version < "3.13"``
|
|
120
|
+
``cachetools`` ``>=6.0; python_version < "3.13"``
|
|
120
121
|
``flask_limiter`` ``>3,!=3.13,<4``
|
|
121
122
|
========================================== ==========================================
|
|
122
123
|
|
|
@@ -149,5 +150,5 @@ Extra Dependencies
|
|
|
149
150
|
============ ============================================
|
|
150
151
|
|
|
151
152
|
The changelog for the provider package can be found in the
|
|
152
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.0
|
|
153
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0/changelog.html>`_.
|
|
153
154
|
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
Package ``apache-airflow-providers-fab``
|
|
25
25
|
|
|
26
|
-
Release: ``3.0
|
|
26
|
+
Release: ``3.2.0``
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
`Flask App Builder <https://flask-appbuilder.readthedocs.io/>`__
|
|
@@ -36,7 +36,7 @@ This is a provider package for ``fab`` provider. All classes for this provider p
|
|
|
36
36
|
are in ``airflow.providers.fab`` python package.
|
|
37
37
|
|
|
38
38
|
You can find package information and changelog for the provider
|
|
39
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.0
|
|
39
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0/>`_.
|
|
40
40
|
|
|
41
41
|
Installation
|
|
42
42
|
------------
|
|
@@ -54,20 +54,20 @@ Requirements
|
|
|
54
54
|
PIP package Version required
|
|
55
55
|
========================================== ==========================================
|
|
56
56
|
``apache-airflow`` ``>=3.0.2``
|
|
57
|
-
``apache-airflow-providers-common-compat`` ``>=1.
|
|
57
|
+
``apache-airflow-providers-common-compat`` ``>=1.12.0``
|
|
58
58
|
``blinker`` ``>=1.6.2; python_version < "3.13"``
|
|
59
59
|
``flask`` ``>=2.2.1,<2.3; python_version < "3.13"``
|
|
60
|
-
``flask-appbuilder`` ``==5.0.
|
|
60
|
+
``flask-appbuilder`` ``==5.0.1; python_version < "3.13"``
|
|
61
61
|
``flask-login`` ``>=0.6.2; python_version < "3.13"``
|
|
62
62
|
``flask-session`` ``>=0.8.0; python_version < "3.13"``
|
|
63
63
|
``msgpack`` ``>=1.0.0; python_version < "3.13"``
|
|
64
64
|
``flask-sqlalchemy`` ``>=3.0.5; python_version < "3.13"``
|
|
65
|
-
``sqlalchemy`` ``<2; python_version < "3.13"``
|
|
66
65
|
``flask-wtf`` ``>=1.1.0; python_version < "3.13"``
|
|
67
66
|
``connexion[flask]`` ``>=2.14.2,<3.0; python_version < "3.13"``
|
|
68
67
|
``jmespath`` ``>=0.7.0; python_version < "3.13"``
|
|
69
68
|
``werkzeug`` ``>=2.2,<4; python_version < "3.13"``
|
|
70
69
|
``wtforms`` ``>=3.0,<4; python_version < "3.13"``
|
|
70
|
+
``cachetools`` ``>=6.0; python_version < "3.13"``
|
|
71
71
|
``flask_limiter`` ``>3,!=3.13,<4``
|
|
72
72
|
========================================== ==========================================
|
|
73
73
|
|
|
@@ -100,4 +100,4 @@ Extra Dependencies
|
|
|
100
100
|
============ ============================================
|
|
101
101
|
|
|
102
102
|
The changelog for the provider package can be found in the
|
|
103
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.0
|
|
103
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0/changelog.html>`_.
|
|
@@ -333,7 +333,7 @@ It's also possible to add Dag Runs resource permissions in a similar way, but ex
|
|
|
333
333
|
dag_id="example_fine_grained_access",
|
|
334
334
|
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
|
|
335
335
|
access_control={
|
|
336
|
-
"Viewer": {"
|
|
336
|
+
"Viewer": {"DAGs": {"can_edit", "can_read", "can_delete"}, "DAG Runs": {"can_create"}},
|
|
337
337
|
},
|
|
338
338
|
)
|
|
339
339
|
|
|
@@ -38,9 +38,9 @@ command as in the example below.
|
|
|
38
38
|
|
|
39
39
|
.. versionchanged:: 3.0.0
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
This
|
|
43
|
-
|
|
41
|
+
Airflow now uses token-based authentication for the public API.
|
|
42
|
+
This mechanism is independent of the configured ``auth_backend``.
|
|
43
|
+
Clients must first obtain a JWT token using :doc:`token`, then include that token in subsequent API requests.
|
|
44
44
|
|
|
45
45
|
Kerberos authentication
|
|
46
46
|
'''''''''''''''''''''''
|
|
@@ -59,7 +59,33 @@ Configuration Steps
|
|
|
59
59
|
|
|
60
60
|
This replaces the default ``SimpleAuthManager``.
|
|
61
61
|
|
|
62
|
-
2. **
|
|
62
|
+
2. **Enable OAuth Authentication Type**
|
|
63
|
+
|
|
64
|
+
Set ``AUTH_TYPE`` to ``AUTH_OAUTH`` in your ``webserver_config.py`` file
|
|
65
|
+
(located at ``$AIRFLOW_HOME/webserver_config.py`` by default, configurable via
|
|
66
|
+
``[fab] config_file`` in ``airflow.cfg``):
|
|
67
|
+
|
|
68
|
+
.. code-block:: python
|
|
69
|
+
|
|
70
|
+
from flask_appbuilder.const import AUTH_OAUTH
|
|
71
|
+
|
|
72
|
+
AUTH_TYPE = AUTH_OAUTH
|
|
73
|
+
|
|
74
|
+
.. important::
|
|
75
|
+
This step is required. Without setting ``AUTH_TYPE = AUTH_OAUTH``,
|
|
76
|
+
the OAuth providers will not be activated even if ``OAUTH_PROVIDERS``
|
|
77
|
+
is configured. The default ``AUTH_TYPE = AUTH_DB`` uses database
|
|
78
|
+
authentication only.
|
|
79
|
+
|
|
80
|
+
.. note::
|
|
81
|
+
If the ``webserver_config.py`` file does not exist in your environment,
|
|
82
|
+
you need to create it manually. A template with default values and examples
|
|
83
|
+
can be found in the Airflow source at
|
|
84
|
+
``airflow-core/src/airflow/config_templates/default_webserver_config.py``.
|
|
85
|
+
You can copy this file to ``$AIRFLOW_HOME/webserver_config.py`` and modify
|
|
86
|
+
it for your needs.
|
|
87
|
+
|
|
88
|
+
3. **Install Required Packages**
|
|
63
89
|
|
|
64
90
|
If not already installed, ensure the FAB provider is available:
|
|
65
91
|
|
|
@@ -71,7 +97,7 @@ Configuration Steps
|
|
|
71
97
|
The FAB Auth Manager provider is not installed by default in Airflow 3.
|
|
72
98
|
You must install it explicitly to use OAuth2-based SSO.
|
|
73
99
|
|
|
74
|
-
|
|
100
|
+
4. **Configure OAuth2 Provider**
|
|
75
101
|
|
|
76
102
|
FAB Auth Manager reads provider configuration from the ``[fab]`` section
|
|
77
103
|
of ``airflow.cfg`` or from environment variables.
|
|
@@ -119,13 +145,13 @@ Configuration Steps
|
|
|
119
145
|
|
|
120
146
|
Adjust these values according to your provider's documentation.
|
|
121
147
|
|
|
122
|
-
|
|
148
|
+
5. **Restart Airflow Webserver**
|
|
123
149
|
|
|
124
150
|
.. code-block:: bash
|
|
125
151
|
|
|
126
152
|
airflow webserver --reload
|
|
127
153
|
|
|
128
|
-
|
|
154
|
+
6. **Test SSO Login**
|
|
129
155
|
|
|
130
156
|
Open the Airflow UI. You should see a login option for your SSO provider.
|
|
131
157
|
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
.. Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
or more contributor license agreements. See the NOTICE file
|
|
3
|
+
distributed with this work for additional information
|
|
4
|
+
regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
to you under the Apache License, Version 2.0 (the
|
|
6
|
+
"License"); you may not use this file except in compliance
|
|
7
|
+
with the License. You may obtain a copy of the License at
|
|
8
|
+
|
|
9
|
+
.. http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
|
|
11
|
+
.. Unless required by applicable law or agreed to in writing,
|
|
12
|
+
software distributed under the License is distributed on an
|
|
13
|
+
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
KIND, either express or implied. See the License for the
|
|
15
|
+
specific language governing permissions and limitations
|
|
16
|
+
under the License.
|
|
17
|
+
|
|
18
|
+
Generate JWT token with FAB auth manager
|
|
19
|
+
========================================
|
|
20
|
+
|
|
21
|
+
.. note::
|
|
22
|
+
This guide only applies if your environment is configured with FAB auth manager.
|
|
23
|
+
|
|
24
|
+
To use the :doc:`Airflow public API <apache-airflow:stable-rest-api-ref>`, you first need to obtain a JWT Token for
|
|
25
|
+
authentication.
|
|
26
|
+
Once you have the token, include it in the ``Authorization`` header when making requests to the public API.
|
|
27
|
+
|
|
28
|
+
You can generate a JWT token using the ``Create Token`` API endpoint,
|
|
29
|
+
documented in :doc:`/api-ref/fab-token-api-ref`.
|
|
30
|
+
|
|
31
|
+
Example
|
|
32
|
+
'''''''
|
|
33
|
+
|
|
34
|
+
Use the following example to generate a token via username and password.
|
|
35
|
+
|
|
36
|
+
.. code-block:: bash
|
|
37
|
+
|
|
38
|
+
ENDPOINT_URL="http://localhost:8080"
|
|
39
|
+
curl -X 'POST' \
|
|
40
|
+
"${ENDPOINT_URL}/auth/token" \
|
|
41
|
+
-H 'Content-Type: application/json' \
|
|
42
|
+
-d '{
|
|
43
|
+
"username": "<username>",
|
|
44
|
+
"password": "<password>"
|
|
45
|
+
}'
|
|
46
|
+
|
|
47
|
+
If successful, this request returns a JWT token that you can use for subsequent Airflow public API calls.
|
|
48
|
+
|
|
49
|
+
Only users authenticated via the database (``AUTH_TYPE = AUTH_DB``) or LDAP
|
|
50
|
+
(``AUTH_TYPE = AUTH_LDAP``) can generate tokens using this method.
|
|
51
|
+
For more details, see :doc:`webserver-authentication`.
|
|
52
|
+
|
|
53
|
+
If you need to generate a token using a different authentication mechanism, see the next section.
|
|
54
|
+
|
|
55
|
+
Custom authentication implementation
|
|
56
|
+
------------------------------------
|
|
57
|
+
|
|
58
|
+
By default, JWT tokens for the Airflow public API can only be generated using
|
|
59
|
+
basic authentication (username and password) for database or LDAP users.
|
|
60
|
+
|
|
61
|
+
If you want to support another authentication mechanism, such as oauth, you can do so by overriding the
|
|
62
|
+
``create_token`` method in the FAB auth manager.
|
|
63
|
+
|
|
64
|
+
Example
|
|
65
|
+
'''''''
|
|
66
|
+
|
|
67
|
+
.. code-block:: python
|
|
68
|
+
|
|
69
|
+
class MyAuthManager(FabAuthManager):
|
|
70
|
+
|
|
71
|
+
def create_token(self, headers: dict[str, str], body: dict[str, Any]) -> User:
|
|
72
|
+
"""
|
|
73
|
+
Return the authenticated user for a given payload.
|
|
74
|
+
|
|
75
|
+
Implement your own custom token creation logic here.
|
|
76
|
+
"""
|
|
77
|
+
...
|
|
78
|
+
|
|
79
|
+
Oauth example
|
|
80
|
+
'''''''''''''
|
|
81
|
+
|
|
82
|
+
Below is an example implementation that uses OAuth to allow users to obtain a JWT token.
|
|
83
|
+
This custom logic overrides the default ``create_token`` method from the FAB authentication manager.
|
|
84
|
+
|
|
85
|
+
.. warning::
|
|
86
|
+
The example shown below disables signature verification (``verify_signature=False``).
|
|
87
|
+
This is **insecure** and should only be used for testing. Always validate tokens properly in production.
|
|
88
|
+
Furthermore you need to make sure that the claims of the JWT are valid.
|
|
89
|
+
Critical claims that you must verify are for example (but not limited to):
|
|
90
|
+
- ``iss`` (issuer)
|
|
91
|
+
- ``aud`` (audience)
|
|
92
|
+
- ``nbf`` (not before time)
|
|
93
|
+
- ``exp`` (expiration time)
|
|
94
|
+
Refer to the documentation of your identity provider for more information.
|
|
95
|
+
|
|
96
|
+
.. code-block:: python
|
|
97
|
+
|
|
98
|
+
class MyAuthManager(FabAuthManager):
|
|
99
|
+
|
|
100
|
+
def create_token(self, headers: dict[str, str], body: dict[str, Any]) -> User:
|
|
101
|
+
"""
|
|
102
|
+
Return the authenticated user derived from an OAuth access token.
|
|
103
|
+
|
|
104
|
+
Implement your own custom token validation and user mapping logic here.
|
|
105
|
+
"""
|
|
106
|
+
user = None
|
|
107
|
+
|
|
108
|
+
# Handle OAuth-based authentication
|
|
109
|
+
if self.security_manager.auth_type == AUTH_OAUTH:
|
|
110
|
+
# Require a Bearer token
|
|
111
|
+
auth_header = headers.get("Authorization")
|
|
112
|
+
if not auth_header:
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
token = auth_header.replace("Bearer ", "")
|
|
116
|
+
|
|
117
|
+
# Example token decoding
|
|
118
|
+
#
|
|
119
|
+
# With signature validation (recommended):
|
|
120
|
+
# me = jwt.decode(
|
|
121
|
+
# token,
|
|
122
|
+
# public_key,
|
|
123
|
+
# algorithms=['HS256', 'RS256'],
|
|
124
|
+
# audience=CLIENT_ID,
|
|
125
|
+
# issuer=ISSUER_URL,
|
|
126
|
+
# )
|
|
127
|
+
#
|
|
128
|
+
# Without signature validation (not recommended):
|
|
129
|
+
me = jwt.decode(token, options={"verify_signature": False})
|
|
130
|
+
|
|
131
|
+
# Extract groups/roles (example schema — adjust to your provider)
|
|
132
|
+
groups = me["resource_access"]["airflow"]["roles"] # requires validation
|
|
133
|
+
if not groups:
|
|
134
|
+
groups = ["airflow_public"]
|
|
135
|
+
else:
|
|
136
|
+
groups = [g for g in groups if "airflow" in g]
|
|
137
|
+
|
|
138
|
+
# Build user info payload for FAB
|
|
139
|
+
userinfo = {
|
|
140
|
+
"username": me.get("preferred_username"),
|
|
141
|
+
"email": me.get("email"),
|
|
142
|
+
"first_name": me.get("given_name"),
|
|
143
|
+
"last_name": me.get("family_name"),
|
|
144
|
+
"role_keys": groups,
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
user = self.security_manager.auth_user_oauth(userinfo, rotate_session_id=False)
|
|
148
|
+
|
|
149
|
+
# Fall back to the default implementation
|
|
150
|
+
else:
|
|
151
|
+
user = super().create_token(headers=headers, body=body)
|
|
152
|
+
|
|
153
|
+
log.info("User: %s", user)
|
|
154
|
+
|
|
155
|
+
return user
|
|
@@ -23,7 +23,9 @@ FAB auth manager authentication
|
|
|
23
23
|
While this documentation refers to authentication using the ``apache-airflow-providers-fab`` package, please note:
|
|
24
24
|
|
|
25
25
|
- The **FAB auth provider** is actively maintained and compatible with the latest versions of Airflow.
|
|
26
|
-
-
|
|
26
|
+
- It is preferred to configure supported authentication options using the new ``auth_manager`` framework configured in ``airflow.cfg``.
|
|
27
|
+
- The ``webserver_config.py`` file is still used for more advanced options,
|
|
28
|
+
such as Single Sign-On with OAuth.
|
|
27
29
|
|
|
28
30
|
For more, see the :doc:`token`.
|
|
29
31
|
|
|
@@ -236,6 +238,86 @@ webserver_config.py itself if you wish.
|
|
|
236
238
|
log.debug(f"User info from GitHub: {user_data}\nTeam info from GitHub: {teams}")
|
|
237
239
|
return {"username": "github_" + user_data.get("login"), "role_keys": roles}
|
|
238
240
|
|
|
241
|
+
Example using role / group based Authorization with Azure Active Directory
|
|
242
|
+
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
243
|
+
|
|
244
|
+
Here is an example of what you might have in your ``webserver_config.py``:
|
|
245
|
+
|
|
246
|
+
.. code-block:: python
|
|
247
|
+
|
|
248
|
+
from airflow.providers.fab.auth_manager.security_manager.override import FabAirflowSecurityManagerOverride
|
|
249
|
+
from flask_appbuilder.security.manager import AUTH_OAUTH
|
|
250
|
+
|
|
251
|
+
AUTH_TYPE = AUTH_OAUTH
|
|
252
|
+
AUTH_USER_REGISTRATION = True
|
|
253
|
+
AUTH_ROLES_SYNC_AT_LOGIN = True
|
|
254
|
+
|
|
255
|
+
AUTH_ROLES_MAPPING = {
|
|
256
|
+
"Azure-Admins": ["Admin"],
|
|
257
|
+
"Azure-Users": ["User"],
|
|
258
|
+
"Azure-Viewers": ["Viewer"],
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
OAUTH_PROVIDERS = [
|
|
262
|
+
{
|
|
263
|
+
"name": "azure",
|
|
264
|
+
"icon": "fa-windows",
|
|
265
|
+
"token_key": "access_token",
|
|
266
|
+
"remote_app": {
|
|
267
|
+
"client_id": "<your-client-id>",
|
|
268
|
+
"client_secret": "<your-client-secret>",
|
|
269
|
+
"api_base_url": "https://graph.microsoft.com/v1.0/",
|
|
270
|
+
"client_kwargs": {"scope": "openid email profile"},
|
|
271
|
+
"access_token_url": "https://login.microsoftonline.com/<your-tenant-id>/oauth2/v2.0/token",
|
|
272
|
+
"authorize_url": "https://login.microsoftonline.com/<your-tenant-id>/oauth2/v2.0/authorize",
|
|
273
|
+
"request_token_url": None,
|
|
274
|
+
},
|
|
275
|
+
}
|
|
276
|
+
]
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
class AzureAdSecurityManager(FabAirflowSecurityManagerOverride):
|
|
280
|
+
def get_oauth_user_info(self, provider, response):
|
|
281
|
+
if provider != "azure":
|
|
282
|
+
return {}
|
|
283
|
+
|
|
284
|
+
groups = response.get("groups", [])
|
|
285
|
+
roles = response.get("roles", [])
|
|
286
|
+
|
|
287
|
+
return {
|
|
288
|
+
"username": response.get("preferred_username"),
|
|
289
|
+
"email": response.get("email"),
|
|
290
|
+
"first_name": response.get("given_name"),
|
|
291
|
+
"last_name": response.get("family_name"),
|
|
292
|
+
"role_keys": groups or roles,
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
SECURITY_MANAGER_CLASS = AzureAdSecurityManager
|
|
297
|
+
|
|
298
|
+
.. note::
|
|
299
|
+
|
|
300
|
+
* Azure AD group or role claims must be explicitly enabled in the application
|
|
301
|
+
registration (for example via ``groupMembershipClaims``).
|
|
302
|
+
* Depending on tenant configuration, group claims may be returned as IDs
|
|
303
|
+
rather than display names.
|
|
304
|
+
* For large group memberships, querying Microsoft Graph may be required
|
|
305
|
+
instead of relying solely on token claims.
|
|
306
|
+
|
|
307
|
+
.. figure:: /img/azure-ad-authentication.jpeg
|
|
308
|
+
:alt: Azure AD app registration authentication settings
|
|
309
|
+
|
|
310
|
+
Azure AD app registration authentication configuration showing the redirect URI
|
|
311
|
+
(``http://localhost:8080/auth/oauth-authorized/azure``) required for Airflow OAuth
|
|
312
|
+
integration.
|
|
313
|
+
|
|
314
|
+
.. figure:: /img/azure-ad-token-claims.jpeg
|
|
315
|
+
:alt: Azure AD token configuration with group or role claims enabled
|
|
316
|
+
|
|
317
|
+
Azure AD app registration token configuration showing the ``groups`` optional claim
|
|
318
|
+
enabled, which allows Azure AD group or role information to be included in the token
|
|
319
|
+
and mapped to Airflow RBAC roles.
|
|
320
|
+
|
|
239
321
|
Example using team based Authorization with KeyCloak
|
|
240
322
|
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
241
323
|
Here is an example of what you might have in your webserver_config.py:
|