vincbeck commented on code in PR #55298: URL: https://github.com/apache/airflow/pull/55298#discussion_r2325675988
########## airflow-core/src/airflow/api_fastapi/auth/managers/base_auth_manager.py: ########## @@ -427,36 +433,243 @@ def get_authorized_dag_ids( """ Get DAGs the user has access to. - By default, reads all the DAGs and check individually if the user has permissions to access the DAG. - Can lead to some poor performance. It is recommended to override this method in the auth manager - implementation to provide a more efficient implementation. - :param user: the user :param method: the method to filter on :param session: the session """ - dag_ids = {dag.dag_id for dag in session.execute(select(DagModel.dag_id))} - return self.filter_authorized_dag_ids(dag_ids=dag_ids, method=method, user=user) + stmt = ( + select(DagModel.dag_id, Team.name) + .join(DagBundleModel, DagModel.bundle_name == DagBundleModel.name) + .join( + dag_bundle_team_association_table, + DagBundleModel.name == dag_bundle_team_association_table.c.dag_bundle_name, + isouter=True, + ) + .join(Team, Team.id == dag_bundle_team_association_table.c.team_id, isouter=True) + ) + rows = session.execute(stmt).all() + dags_by_team: dict[str | None, set[str]] = defaultdict(set) + for dag_id, team_name in rows: + dags_by_team[team_name].add(dag_id) + + dag_ids: set[str] = set() + for team_name, team_dag_ids in dags_by_team.items(): + dag_ids.update( + self.filter_authorized_dag_ids( + dag_ids=team_dag_ids, user=user, method=method, team_name=team_name + ) + ) + + return dag_ids def filter_authorized_dag_ids( self, *, dag_ids: set[str], user: T, method: ResourceMethod = "GET", + team_name: str | None = None, ) -> set[str]: """ Filter DAGs the user has access to. - :param dag_ids: the list of DAG ids + By default, check individually if the user has permissions to access the DAG. + Can lead to some poor performance. It is recommended to override this method in the auth manager + implementation to provide a more efficient implementation. + + :param dag_ids: the set of DAG ids + :param user: the user + :param method: the method to filter on + :param team_name: the name of the team associated to the Dags if Airflow environment runs in + multi-team mode + """ + + def _is_authorized_dag_id(dag_id: str): + return self.is_authorized_dag( + method=method, details=DagDetails(id=dag_id, team_name=team_name), user=user + ) + + return {dag_id for dag_id in dag_ids if _is_authorized_dag_id(dag_id)} + + @provide_session + def get_authorized_connections( + self, + *, + user: T, + method: ResourceMethod = "GET", + session: Session = NEW_SESSION, + ) -> set[str]: + """ + Get connection ids (``conn_id``) the user has access to. + + :param user: the user + :param method: the method to filter on + :param session: the session + """ + stmt = select(Connection.conn_id, Team.name).join(Team, Connection.team_id == Team.id, isouter=True) Review Comment: No worries :) I agree this is confusing. But I am interested by the connections returned by the API `get_connections`. This API retrieves connections only from the DB with this code: ``` connection_select, total_entries = paginated_select( statement=select(Connection), filters=[connection_id_pattern], order_by=order_by, offset=offset, limit=limit, session=session, ) connections = session.scalars(connection_select) ``` So I assume the `get_connections` API only care about connections from the DB? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@airflow.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org