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
相关产品推荐
相关产品推荐

