Skip to content

Commit d5ea56a

Browse files
vatsrahul1001Lee-W
andauthored
AIP-84 Add Auth for DAG Versioning (apache#47553)
* add auth to dag versions endpoints * adding new DagAccessEntity for DAG Version * feat(security): add DagAccessEntity.VERSION --------- Co-authored-by: Wei Lee <weilee.rx@gmail.com>
1 parent 5f004b1 commit d5ea56a

File tree

11 files changed

+74
-14
lines changed

11 files changed

+74
-14
lines changed

airflow/api_fastapi/auth/managers/models/resource_details.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ class DagAccessEntity(Enum):
100100
SLA_MISS = "SLA_MISS"
101101
TASK = "TASK"
102102
TASK_INSTANCE = "TASK_INSTANCE"
103-
TASK_RESCHEDULE = "TASK_RESCHEDULE"
104103
TASK_LOGS = "TASK_LOGS"
104+
TASK_RESCHEDULE = "TASK_RESCHEDULE"
105+
VERSION = "VERSION"
105106
WARNING = "WARNING"
106107
XCOM = "XCOM"

airflow/api_fastapi/core_api/openapi/v1-generated.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7055,6 +7055,8 @@ paths:
70557055
summary: Get Dag Version
70567056
description: Get one Dag Version.
70577057
operationId: get_dag_version
7058+
security:
7059+
- OAuth2PasswordBearer: []
70587060
parameters:
70597061
- name: dag_id
70607062
in: path
@@ -7110,6 +7112,8 @@ paths:
71107112
This endpoint allows specifying `~` as the dag_id to retrieve DAG Versions
71117113
for all DAGs.'
71127114
operationId: get_dag_versions
7115+
security:
7116+
- OAuth2PasswordBearer: []
71137117
parameters:
71147118
- name: dag_id
71157119
in: path

airflow/api_fastapi/core_api/routes/public/dag_versions.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from fastapi import Depends, HTTPException, Request, status
2222
from sqlalchemy import select
2323

24+
from airflow.api_fastapi.auth.managers.models.resource_details import DagAccessEntity
2425
from airflow.api_fastapi.common.db.common import SessionDep, paginated_select
2526
from airflow.api_fastapi.common.parameters import (
2627
FilterParam,
@@ -35,6 +36,7 @@
3536
DagVersionResponse,
3637
)
3738
from airflow.api_fastapi.core_api.openapi.exceptions import create_openapi_http_exception_doc
39+
from airflow.api_fastapi.core_api.security import requires_access_dag
3840
from airflow.models.dag import DAG
3941
from airflow.models.dag_version import DagVersion
4042

@@ -48,6 +50,7 @@
4850
status.HTTP_404_NOT_FOUND,
4951
]
5052
),
53+
dependencies=[Depends(requires_access_dag(method="GET", access_entity=DagAccessEntity.VERSION))],
5154
)
5255
def get_dag_version(
5356
dag_id: str,
@@ -71,8 +74,9 @@ def get_dag_version(
7174
responses=create_openapi_http_exception_doc(
7275
[
7376
status.HTTP_404_NOT_FOUND,
74-
]
77+
],
7578
),
79+
dependencies=[Depends(requires_access_dag(method="GET", access_entity=DagAccessEntity.VERSION))],
7680
)
7781
def get_dag_versions(
7882
dag_id: str,

airflow/security/permissions.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
RESOURCE_DAG_PREFIX = "DAG:"
3333
RESOURCE_DAG_RUN = "DAG Runs"
3434
RESOURCE_DAG_RUN_PREFIX = "DAG Run:"
35+
RESOURCE_DAG_VERSION = "DAG Versions"
3536
RESOURCE_DAG_WARNING = "DAG Warnings"
3637
RESOURCE_CLUSTER_ACTIVITY = "Cluster Activity"
3738
RESOURCE_ASSET = "Assets"

providers/amazon/tests/unit/amazon/aws/auth_manager/test_aws_auth_manager.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,10 @@ def test_batch_is_authorized_dag(
484484
requests=[
485485
{"method": "GET"},
486486
{"method": "GET", "details": DagDetails(id="dag_1")},
487-
{"method": "GET", "details": DagDetails(id="dag_1"), "access_entity": DagAccessEntity.CODE},
487+
]
488+
+ [
489+
{"method": "GET", "details": DagDetails(id="dag_1"), "access_entity": dag_access_entity}
490+
for dag_access_entity in DagAccessEntity
488491
],
489492
user=mock,
490493
)
@@ -503,16 +506,28 @@ def test_batch_is_authorized_dag(
503506
"entity_id": "dag_1",
504507
"context": None,
505508
},
509+
]
510+
+ [
506511
{
507512
"method": "GET",
508513
"entity_type": AvpEntities.DAG,
509514
"entity_id": "dag_1",
510-
"context": {
511-
"dag_entity": {
512-
"string": DagAccessEntity.CODE.value,
513-
},
514-
},
515-
},
515+
"context": {"dag_entity": {"string": dag_entity}},
516+
}
517+
for dag_entity in (
518+
DagAccessEntity.AUDIT_LOG.value,
519+
DagAccessEntity.CODE.value,
520+
DagAccessEntity.DEPENDENCIES.value,
521+
DagAccessEntity.RUN.value,
522+
DagAccessEntity.SLA_MISS.value,
523+
DagAccessEntity.TASK.value,
524+
DagAccessEntity.TASK_INSTANCE.value,
525+
DagAccessEntity.TASK_LOGS.value,
526+
DagAccessEntity.TASK_RESCHEDULE.value,
527+
DagAccessEntity.VERSION.value,
528+
DagAccessEntity.WARNING.value,
529+
DagAccessEntity.XCOM.value,
530+
)
516531
],
517532
user=ANY,
518533
)

providers/common/compat/src/airflow/providers/common/compat/security/permissions.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,22 @@
1919
from typing import TYPE_CHECKING
2020

2121
if TYPE_CHECKING:
22-
from airflow.security.permissions import RESOURCE_ASSET, RESOURCE_ASSET_ALIAS, RESOURCE_BACKFILL
22+
from airflow.security.permissions import (
23+
RESOURCE_ASSET,
24+
RESOURCE_ASSET_ALIAS,
25+
RESOURCE_BACKFILL,
26+
RESOURCE_DAG_VERSION,
27+
)
2328
else:
2429
try:
25-
from airflow.security.permissions import RESOURCE_ASSET, RESOURCE_ASSET_ALIAS, RESOURCE_BACKFILL
30+
from airflow.security.permissions import (
31+
RESOURCE_ASSET,
32+
RESOURCE_ASSET_ALIAS,
33+
RESOURCE_BACKFILL,
34+
RESOURCE_DAG_VERSION,
35+
)
2636
except ImportError:
2737
from airflow.security.permissions import RESOURCE_DATASET as RESOURCE_ASSET
2838

2939

30-
__all__ = ["RESOURCE_ASSET", "RESOURCE_ASSET_ALIAS", "RESOURCE_BACKFILL"]
40+
__all__ = ["RESOURCE_ASSET", "RESOURCE_ASSET_ALIAS", "RESOURCE_BACKFILL", "RESOURCE_DAG_VERSION"]

providers/fab/src/airflow/providers/fab/auth_manager/fab_auth_manager.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
RESOURCE_DAG_CODE,
7777
RESOURCE_DAG_DEPENDENCIES,
7878
RESOURCE_DAG_RUN,
79+
RESOURCE_DAG_VERSION,
7980
RESOURCE_DAG_WARNING,
8081
RESOURCE_DOCS,
8182
RESOURCE_IMPORT_ERROR,
@@ -136,6 +137,7 @@
136137
DagAccessEntity.TASK_INSTANCE: (RESOURCE_DAG_RUN, RESOURCE_TASK_INSTANCE),
137138
DagAccessEntity.TASK_LOGS: (RESOURCE_TASK_LOG,),
138139
DagAccessEntity.TASK_RESCHEDULE: (RESOURCE_TASK_RESCHEDULE,),
140+
DagAccessEntity.VERSION: (RESOURCE_DAG_VERSION,),
139141
DagAccessEntity.WARNING: (RESOURCE_DAG_WARNING,),
140142
DagAccessEntity.XCOM: (RESOURCE_XCOM,),
141143
}

providers/fab/src/airflow/providers/fab/auth_manager/security_manager/override.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,13 +212,14 @@ class FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
212212
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_DEPENDENCIES),
213213
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_CODE),
214214
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_RUN),
215+
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_VERSION),
216+
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_WARNING),
215217
(permissions.ACTION_CAN_READ, RESOURCE_ASSET),
216218
(permissions.ACTION_CAN_READ, RESOURCE_ASSET_ALIAS),
217219
(permissions.ACTION_CAN_READ, RESOURCE_BACKFILL),
218220
(permissions.ACTION_CAN_READ, permissions.RESOURCE_CLUSTER_ACTIVITY),
219221
(permissions.ACTION_CAN_READ, permissions.RESOURCE_POOL),
220222
(permissions.ACTION_CAN_READ, permissions.RESOURCE_IMPORT_ERROR),
221-
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_WARNING),
222223
(permissions.ACTION_CAN_READ, permissions.RESOURCE_JOB),
223224
(permissions.ACTION_CAN_READ, permissions.RESOURCE_MY_PASSWORD),
224225
(permissions.ACTION_CAN_EDIT, permissions.RESOURCE_MY_PASSWORD),

providers/fab/src/airflow/providers/fab/www/security/permissions.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
RESOURCE_DAG_PREFIX = "DAG:"
3333
RESOURCE_DAG_RUN = "DAG Runs"
3434
RESOURCE_DAG_RUN_PREFIX = "DAG Run:"
35+
RESOURCE_DAG_VERSION = "DAG Versions"
3536
RESOURCE_DAG_WARNING = "DAG Warnings"
3637
RESOURCE_CLUSTER_ACTIVITY = "Cluster Activity"
3738
RESOURCE_ASSET = "Assets"

providers/fab/tests/unit/fab/auth_manager/test_security.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,12 +426,13 @@ def test_get_user_roles_for_anonymous_user(app, security_manager):
426426
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_DEPENDENCIES),
427427
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_CODE),
428428
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_RUN),
429+
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_VERSION),
430+
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_WARNING),
429431
(permissions.ACTION_CAN_READ, RESOURCE_ASSET),
430432
(permissions.ACTION_CAN_READ, RESOURCE_ASSET_ALIAS),
431433
(permissions.ACTION_CAN_READ, RESOURCE_BACKFILL),
432434
(permissions.ACTION_CAN_READ, permissions.RESOURCE_CLUSTER_ACTIVITY),
433435
(permissions.ACTION_CAN_READ, permissions.RESOURCE_IMPORT_ERROR),
434-
(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_WARNING),
435436
(permissions.ACTION_CAN_READ, permissions.RESOURCE_JOB),
436437
(permissions.ACTION_CAN_READ, permissions.RESOURCE_POOL),
437438
(permissions.ACTION_CAN_READ, permissions.RESOURCE_SLA_MISS),

0 commit comments

Comments
 (0)