You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Airflow 2.9.3集成Azure Entra ID OAuth2时AUTH_ROLES_MAPPING失效

Airflow 2.9.3 Azure Entra ID OAuth2角色映射失效解决方案

针对你遇到的角色映射仅生效默认角色、无法读取Azure应用注册中定义角色的问题,可按以下步骤排查修复:

1. 修正角色提取逻辑,确保token中的角色被正确获取

你的get_oauth_user_info方法依赖super().get_oauth_user_info返回的role_keys,但默认实现可能未正确解析Azure Entra ID返回的roles声明(Azure的App Roles会放在JWT Token的roles字段中)。需手动从access token提取角色:

修改AzureCustomSecurity类的方法:

class AzureCustomSecurity(FabAirflowSecurityManagerOverride, LoggingMixin):
    def get_oauth_user_info(self, provider, response=None):
        logging.info(f"Parsing JWT token for provider : {provider}")
        
        roles = ["Public"]
        # 从response中获取access token并解析角色
        access_token = response.get('access_token')
        if access_token:
            import jwt
            try:
                # 禁用签名验证(若已配置jwks可开启)
                decoded_token = jwt.decode(access_token, options={"verify_signature": False})
                roles = decoded_token.get('roles', ["Public"])
                logging.info(f"Extracted roles from token: {roles}")
            except Exception as e:
                logging.error(f"Failed to decode token: {str(e)}")
        
        # 获取用户基础信息
        me = super().get_oauth_user_info(provider, response)
        
        return {
            "name": f"{me['first_name']} {me['last_name']}",
            "email": me["email"],
            "first_name": me["first_name"],
            "last_name": me["last_name"],
            "id": me["email"],
            "username": me["first_name"],
            "role_keys": roles  # 使用解析到的实际角色
        }

2. 确保角色映射键与Azure App Role的Value完全匹配

检查Azure应用注册中App Roles的Value字段(而非显示名称),必须与AUTH_ROLES_MAPPING的键完全一致(大小写敏感):

  • 例如Azure中App Role的Value为airflow_aaa_admin,则AUTH_ROLES_MAPPING中对应键必须是"airflow_aaa_admin"
  • 确认Token中roles字段返回的内容与这些Value完全匹配

3. 验证同步配置的生效条件

确保以下配置正确:

AUTH_USER_REGISTRATION = True  # 允许自动注册用户
AUTH_ROLES_SYNC_AT_LOGIN = True  # 每次登录时同步角色

同时检查Airflow Web UI的Security > List Roles页面,确认Admin、Op、Viewer这些默认角色存在。

4. 确认Helm部署的配置未被覆盖

通过kubectl进入Webserver容器,验证webserver_config.py的内容是否与本地配置一致:

kubectl exec -it <airflow-webserver-pod-name> -- cat /opt/airflow/webserver_config.py

若配置被Helm默认值覆盖,需在Helm values.yaml中指定自定义配置文件的挂载路径,确保Webserver加载正确的配置。

内容的提问来源于stack exchange,提问作者Abhijit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:13:17