Skip to content

Commit a26ea38

Browse files
authored
feat(AIP-84): Add Auth for ui assets (#47485)
* feat(AIP-84): Add Auth for ui assets * build: rebuild airflow/api_fastapi/core_api/openapi/v1-generated.yaml * feat(api_fastapi): remove dag_id param from request_dag_access * test: fix require_access_dag tests
1 parent cf03492 commit a26ea38

File tree

11 files changed

+84
-110
lines changed

11 files changed

+84
-110
lines changed

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

+15-39
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ paths:
1313
- Asset
1414
summary: Next Run Assets
1515
operationId: next_run_assets
16+
security:
17+
- OAuth2PasswordBearer: []
1618
parameters:
1719
- name: dag_id
1820
in: path
@@ -1025,14 +1027,6 @@ paths:
10251027
- type: string
10261028
- type: 'null'
10271029
title: Before
1028-
- name: dag_id
1029-
in: query
1030-
required: false
1031-
schema:
1032-
anyOf:
1033-
- type: string
1034-
- type: 'null'
1035-
title: Dag Id
10361030
responses:
10371031
'204':
10381032
description: Successful Response
@@ -1121,9 +1115,7 @@ paths:
11211115
in: path
11221116
required: true
11231117
schema:
1124-
anyOf:
1125-
- type: string
1126-
- type: 'null'
1118+
type: string
11271119
title: Dag Id
11281120
- name: before
11291121
in: query
@@ -1176,9 +1168,7 @@ paths:
11761168
in: path
11771169
required: true
11781170
schema:
1179-
anyOf:
1180-
- type: string
1181-
- type: 'null'
1171+
type: string
11821172
title: Dag Id
11831173
- name: before
11841174
in: query
@@ -1235,9 +1225,7 @@ paths:
12351225
in: path
12361226
required: true
12371227
schema:
1238-
anyOf:
1239-
- type: string
1240-
- type: 'null'
1228+
type: string
12411229
title: Dag Id
12421230
- name: asset_id
12431231
in: path
@@ -1297,9 +1285,7 @@ paths:
12971285
in: path
12981286
required: true
12991287
schema:
1300-
anyOf:
1301-
- type: string
1302-
- type: 'null'
1288+
type: string
13031289
title: Dag Id
13041290
- name: asset_id
13051291
in: path
@@ -3595,14 +3581,6 @@ paths:
35953581
schema:
35963582
type: integer
35973583
title: Event Log Id
3598-
- name: dag_id
3599-
in: query
3600-
required: false
3601-
schema:
3602-
anyOf:
3603-
- type: string
3604-
- type: 'null'
3605-
title: Dag Id
36063584
responses:
36073585
'200':
36083586
description: Successful Response
@@ -3644,14 +3622,6 @@ paths:
36443622
security:
36453623
- OAuth2PasswordBearer: []
36463624
parameters:
3647-
- name: dag_id
3648-
in: query
3649-
required: false
3650-
schema:
3651-
anyOf:
3652-
- type: string
3653-
- type: 'null'
3654-
title: Dag Id
36553625
- name: limit
36563626
in: query
36573627
required: false
@@ -3675,6 +3645,14 @@ paths:
36753645
type: string
36763646
default: id
36773647
title: Order By
3648+
- name: dag_id
3649+
in: query
3650+
required: false
3651+
schema:
3652+
anyOf:
3653+
- type: string
3654+
- type: 'null'
3655+
title: Dag Id
36783656
- name: task_id
36793657
in: query
36803658
required: false
@@ -3801,9 +3779,7 @@ paths:
38013779
in: path
38023780
required: true
38033781
schema:
3804-
anyOf:
3805-
- type: string
3806-
- type: 'null'
3782+
type: string
38073783
title: Dag Id
38083784
- name: dag_run_id
38093785
in: path

airflow/api_fastapi/core_api/routes/ui/assets.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,22 @@
1717

1818
from __future__ import annotations
1919

20-
from fastapi import HTTPException, Request, status
20+
from fastapi import Depends, HTTPException, Request, status
2121
from sqlalchemy import and_, func, select
2222

2323
from airflow.api_fastapi.common.db.common import SessionDep
2424
from airflow.api_fastapi.common.router import AirflowRouter
25+
from airflow.api_fastapi.core_api.security import requires_access_asset, requires_access_dag
2526
from airflow.models import DagModel
2627
from airflow.models.asset import AssetDagRunQueue, AssetEvent, AssetModel, DagScheduleAssetReference
2728

2829
assets_router = AirflowRouter(tags=["Asset"])
2930

3031

31-
@assets_router.get("/next_run_assets/{dag_id}")
32+
@assets_router.get(
33+
"/next_run_assets/{dag_id}",
34+
dependencies=[Depends(requires_access_asset(method="GET")), Depends(requires_access_dag(method="GET"))],
35+
)
3236
def next_run_assets(
3337
dag_id: str,
3438
request: Request,
@@ -40,7 +44,6 @@ def next_run_assets(
4044
raise HTTPException(status.HTTP_404_NOT_FOUND, f"can't find dag {dag_id}")
4145

4246
dag_model = DagModel.get_dagmodel(dag_id, session=session)
43-
4447
if dag_model is None:
4548
raise HTTPException(status.HTTP_404_NOT_FOUND, f"can't find associated dag_model {dag_id}")
4649

airflow/api_fastapi/core_api/security.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,11 @@ async def get_user_with_exception_handling(request: Request) -> BaseUser | None:
8181

8282
def requires_access_dag(method: ResourceMethod, access_entity: DagAccessEntity | None = None) -> Callable:
8383
def inner(
84+
request: Request,
8485
user: Annotated[BaseUser, Depends(get_user)],
85-
dag_id: str | None = None,
8686
) -> None:
87+
dag_id = request.path_params.get("dag_id") or request.query_params.get("dag_id")
88+
8789
_requires_access(
8890
is_authorized_callback=lambda: get_auth_manager().is_authorized_dag(
8991
method=method, access_entity=access_entity, details=DagDetails(id=dag_id), user=user

airflow/ui/openapi-gen/queries/common.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -856,14 +856,12 @@ export type EventLogServiceGetEventLogQueryResult<
856856
export const useEventLogServiceGetEventLogKey = "EventLogServiceGetEventLog";
857857
export const UseEventLogServiceGetEventLogKeyFn = (
858858
{
859-
dagId,
860859
eventLogId,
861860
}: {
862-
dagId?: string;
863861
eventLogId: number;
864862
},
865863
queryKey?: Array<unknown>,
866-
) => [useEventLogServiceGetEventLogKey, ...(queryKey ?? [{ dagId, eventLogId }])];
864+
) => [useEventLogServiceGetEventLogKey, ...(queryKey ?? [{ eventLogId }])];
867865
export type EventLogServiceGetEventLogsDefaultResponse = Awaited<
868866
ReturnType<typeof EventLogService.getEventLogs>
869867
>;

airflow/ui/openapi-gen/queries/prefetch.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -1164,32 +1164,29 @@ export const prefetchUseDagServiceGetDagTags = (
11641164
* Get Event Log
11651165
* @param data The data for the request.
11661166
* @param data.eventLogId
1167-
* @param data.dagId
11681167
* @returns EventLogResponse Successful Response
11691168
* @throws ApiError
11701169
*/
11711170
export const prefetchUseEventLogServiceGetEventLog = (
11721171
queryClient: QueryClient,
11731172
{
1174-
dagId,
11751173
eventLogId,
11761174
}: {
1177-
dagId?: string;
11781175
eventLogId: number;
11791176
},
11801177
) =>
11811178
queryClient.prefetchQuery({
1182-
queryKey: Common.UseEventLogServiceGetEventLogKeyFn({ dagId, eventLogId }),
1183-
queryFn: () => EventLogService.getEventLog({ dagId, eventLogId }),
1179+
queryKey: Common.UseEventLogServiceGetEventLogKeyFn({ eventLogId }),
1180+
queryFn: () => EventLogService.getEventLog({ eventLogId }),
11841181
});
11851182
/**
11861183
* Get Event Logs
11871184
* Get all Event Logs.
11881185
* @param data The data for the request.
1189-
* @param data.dagId
11901186
* @param data.limit
11911187
* @param data.offset
11921188
* @param data.orderBy
1189+
* @param data.dagId
11931190
* @param data.taskId
11941191
* @param data.runId
11951192
* @param data.mapIndex

airflow/ui/openapi-gen/queries/queries.ts

+5-11
Original file line numberDiff line numberDiff line change
@@ -1404,7 +1404,6 @@ export const useDagServiceGetDagTags = <
14041404
* Get Event Log
14051405
* @param data The data for the request.
14061406
* @param data.eventLogId
1407-
* @param data.dagId
14081407
* @returns EventLogResponse Successful Response
14091408
* @throws ApiError
14101409
*/
@@ -1414,28 +1413,26 @@ export const useEventLogServiceGetEventLog = <
14141413
TQueryKey extends Array<unknown> = unknown[],
14151414
>(
14161415
{
1417-
dagId,
14181416
eventLogId,
14191417
}: {
1420-
dagId?: string;
14211418
eventLogId: number;
14221419
},
14231420
queryKey?: TQueryKey,
14241421
options?: Omit<UseQueryOptions<TData, TError>, "queryKey" | "queryFn">,
14251422
) =>
14261423
useQuery<TData, TError>({
1427-
queryKey: Common.UseEventLogServiceGetEventLogKeyFn({ dagId, eventLogId }, queryKey),
1428-
queryFn: () => EventLogService.getEventLog({ dagId, eventLogId }) as TData,
1424+
queryKey: Common.UseEventLogServiceGetEventLogKeyFn({ eventLogId }, queryKey),
1425+
queryFn: () => EventLogService.getEventLog({ eventLogId }) as TData,
14291426
...options,
14301427
});
14311428
/**
14321429
* Get Event Logs
14331430
* Get all Event Logs.
14341431
* @param data The data for the request.
1435-
* @param data.dagId
14361432
* @param data.limit
14371433
* @param data.offset
14381434
* @param data.orderBy
1435+
* @param data.dagId
14391436
* @param data.taskId
14401437
* @param data.runId
14411438
* @param data.mapIndex
@@ -4351,7 +4348,6 @@ export const useVariableServiceBulkVariables = <
43514348
* @param data The data for the request.
43524349
* @param data.assetId
43534350
* @param data.before
4354-
* @param data.dagId
43554351
* @returns void Successful Response
43564352
* @throws ApiError
43574353
*/
@@ -4367,7 +4363,6 @@ export const useAssetServiceDeleteAssetQueuedEvents = <
43674363
{
43684364
assetId: number;
43694365
before?: string;
4370-
dagId?: string;
43714366
},
43724367
TContext
43734368
>,
@@ -4380,12 +4375,11 @@ export const useAssetServiceDeleteAssetQueuedEvents = <
43804375
{
43814376
assetId: number;
43824377
before?: string;
4383-
dagId?: string;
43844378
},
43854379
TContext
43864380
>({
4387-
mutationFn: ({ assetId, before, dagId }) =>
4388-
AssetService.deleteAssetQueuedEvents({ assetId, before, dagId }) as unknown as Promise<TData>,
4381+
mutationFn: ({ assetId, before }) =>
4382+
AssetService.deleteAssetQueuedEvents({ assetId, before }) as unknown as Promise<TData>,
43894383
...options,
43904384
});
43914385
/**

airflow/ui/openapi-gen/queries/suspense.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -1381,7 +1381,6 @@ export const useDagServiceGetDagTagsSuspense = <
13811381
* Get Event Log
13821382
* @param data The data for the request.
13831383
* @param data.eventLogId
1384-
* @param data.dagId
13851384
* @returns EventLogResponse Successful Response
13861385
* @throws ApiError
13871386
*/
@@ -1391,28 +1390,26 @@ export const useEventLogServiceGetEventLogSuspense = <
13911390
TQueryKey extends Array<unknown> = unknown[],
13921391
>(
13931392
{
1394-
dagId,
13951393
eventLogId,
13961394
}: {
1397-
dagId?: string;
13981395
eventLogId: number;
13991396
},
14001397
queryKey?: TQueryKey,
14011398
options?: Omit<UseQueryOptions<TData, TError>, "queryKey" | "queryFn">,
14021399
) =>
14031400
useSuspenseQuery<TData, TError>({
1404-
queryKey: Common.UseEventLogServiceGetEventLogKeyFn({ dagId, eventLogId }, queryKey),
1405-
queryFn: () => EventLogService.getEventLog({ dagId, eventLogId }) as TData,
1401+
queryKey: Common.UseEventLogServiceGetEventLogKeyFn({ eventLogId }, queryKey),
1402+
queryFn: () => EventLogService.getEventLog({ eventLogId }) as TData,
14061403
...options,
14071404
});
14081405
/**
14091406
* Get Event Logs
14101407
* Get all Event Logs.
14111408
* @param data The data for the request.
1412-
* @param data.dagId
14131409
* @param data.limit
14141410
* @param data.offset
14151411
* @param data.orderBy
1412+
* @param data.dagId
14161413
* @param data.taskId
14171414
* @param data.runId
14181415
* @param data.mapIndex

airflow/ui/openapi-gen/requests/services.gen.ts

+2-8
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,6 @@ export class AssetService {
448448
* @param data The data for the request.
449449
* @param data.assetId
450450
* @param data.before
451-
* @param data.dagId
452451
* @returns void Successful Response
453452
* @throws ApiError
454453
*/
@@ -463,7 +462,6 @@ export class AssetService {
463462
},
464463
query: {
465464
before: data.before,
466-
dag_id: data.dagId,
467465
},
468466
errors: {
469467
401: "Unauthorized",
@@ -1904,7 +1902,6 @@ export class EventLogService {
19041902
* Get Event Log
19051903
* @param data The data for the request.
19061904
* @param data.eventLogId
1907-
* @param data.dagId
19081905
* @returns EventLogResponse Successful Response
19091906
* @throws ApiError
19101907
*/
@@ -1915,9 +1912,6 @@ export class EventLogService {
19151912
path: {
19161913
event_log_id: data.eventLogId,
19171914
},
1918-
query: {
1919-
dag_id: data.dagId,
1920-
},
19211915
errors: {
19221916
401: "Unauthorized",
19231917
403: "Forbidden",
@@ -1931,10 +1925,10 @@ export class EventLogService {
19311925
* Get Event Logs
19321926
* Get all Event Logs.
19331927
* @param data The data for the request.
1934-
* @param data.dagId
19351928
* @param data.limit
19361929
* @param data.offset
19371930
* @param data.orderBy
1931+
* @param data.dagId
19381932
* @param data.taskId
19391933
* @param data.runId
19401934
* @param data.mapIndex
@@ -1953,10 +1947,10 @@ export class EventLogService {
19531947
method: "GET",
19541948
url: "/public/eventLogs",
19551949
query: {
1956-
dag_id: data.dagId,
19571950
limit: data.limit,
19581951
offset: data.offset,
19591952
order_by: data.orderBy,
1953+
dag_id: data.dagId,
19601954
task_id: data.taskId,
19611955
run_id: data.runId,
19621956
map_index: data.mapIndex,

0 commit comments

Comments
 (0)