From ad1c8f708aa92a12925978aafa692c2cc3631cb1 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Thu, 9 Apr 2026 14:28:46 +0800 Subject: [PATCH 1/2] Fix Redis scope to use unified scope URL for all cloud types Removed cloud-specific Redis scope URLs (Azure China, Azure US Government) and simplified getScopes() to always return https://redis.azure.com/.default as the default scope regardless of cloud type. Added unit tests for AzureRedisPasswordlessProperties. Fixes: https://github.com/Azure/azure-sdk-for-java/issues/48680 --- sdk/spring/CHANGELOG.md | 10 +++- .../AzureRedisPasswordlessProperties.java | 16 +----- .../AzureRedisPasswordlessPropertiesTest.java | 57 +++++++++++++++++++ 3 files changed, 67 insertions(+), 16 deletions(-) create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessPropertiesTest.java diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index 74a2e782c685..56e6f705e772 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -1,7 +1,15 @@ # Release History # (Unreleased) + Upgrade Spring Boot dependencies version to 4.0.5 and Spring Cloud dependencies version to 2025.1.1 -Upgrade Spring Boot dependencies version to 4.0.4 and Spring Cloud dependencies version to 2025.1.1 + +### Spring Cloud Azure Autoconfigure + +This section includes changes in `spring-cloud-azure-autoconfigure` module. + +#### Bugs Fixed + +- Fixed Bug: AzureRedisPasswordlessProperties uses invalid wildcard scope for AZURE_CHINA, causing ManagedIdentityCredential failure ([#48680](https://github.com/Azure/azure-sdk-for-java/issues/48680)). ## 6.2.0 (2026-03-25) - This release is compatible with Spring Boot 3.5.0-3.5.8. (Note: 3.5.x (x>8) should be supported, but they aren't tested with this release.) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessProperties.java index 15a766263b48..2b83a90d1cbb 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessProperties.java @@ -17,16 +17,6 @@ public class AzureRedisPasswordlessProperties implements PasswordlessProperties { private static final String REDIS_SCOPE_AZURE = "https://redis.azure.com/.default"; - private static final String REDIS_SCOPE_AZURE_CHINA = "https://*.cacheinfra.windows.net.china:10225/appid/.default"; - private static final String REDIS_SCOPE_AZURE_US_GOVERNMENT = "https://*.cacheinfra.windows.us.government.net:10225/appid/.default"; - - private static final Map REDIS_SCOPE_MAP = new HashMap() { - { - put(AzureProfileOptionsProvider.CloudType.AZURE, REDIS_SCOPE_AZURE); - put(AzureProfileOptionsProvider.CloudType.AZURE_CHINA, REDIS_SCOPE_AZURE_CHINA); - put(AzureProfileOptionsProvider.CloudType.AZURE_US_GOVERNMENT, REDIS_SCOPE_AZURE_US_GOVERNMENT); - } - }; private AzureProfileProperties profile = new AzureProfileProperties(); @@ -48,7 +38,7 @@ public class AzureRedisPasswordlessProperties implements PasswordlessProperties */ @Override public String getScopes() { - return this.scopes == null ? getDefaultScopes() : this.scopes; + return this.scopes == null ? REDIS_SCOPE_AZURE : this.scopes; } /** @@ -82,10 +72,6 @@ public void setPasswordlessEnabled(boolean passwordlessEnabled) { this.passwordlessEnabled = passwordlessEnabled; } - private String getDefaultScopes() { - return REDIS_SCOPE_MAP.getOrDefault(getProfile().getCloudType(), REDIS_SCOPE_AZURE); - } - /** * Get the profile * @return the profile diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessPropertiesTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessPropertiesTest.java new file mode 100644 index 000000000000..ab58cb44478f --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessPropertiesTest.java @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.implementation.passwordless.properties; + +import com.azure.spring.cloud.core.provider.AzureProfileOptionsProvider; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +class AzureRedisPasswordlessPropertiesTest { + + private static final String REDIS_SCOPE_AZURE = "https://redis.azure.com/.default"; + + @Test + void defaultScopesShouldReturnAzureRedisScope() { + AzureRedisPasswordlessProperties properties = new AzureRedisPasswordlessProperties(); + assertEquals(REDIS_SCOPE_AZURE, properties.getScopes()); + } + + @Test + void customScopesShouldOverrideDefault() { + AzureRedisPasswordlessProperties properties = new AzureRedisPasswordlessProperties(); + String customScope = "https://custom.redis.scope/.default"; + properties.setScopes(customScope); + assertEquals(customScope, properties.getScopes()); + } + + @Test + void defaultScopesShouldReturnAzureRedisScopeForAzureCloud() { + AzureRedisPasswordlessProperties properties = new AzureRedisPasswordlessProperties(); + properties.getProfile().setCloudType(AzureProfileOptionsProvider.CloudType.AZURE); + assertEquals(REDIS_SCOPE_AZURE, properties.getScopes()); + } + + @Test + void defaultScopesShouldReturnAzureRedisScopeForAzureChinaCloud() { + AzureRedisPasswordlessProperties properties = new AzureRedisPasswordlessProperties(); + properties.getProfile().setCloudType(AzureProfileOptionsProvider.CloudType.AZURE_CHINA); + assertEquals(REDIS_SCOPE_AZURE, properties.getScopes()); + } + + @Test + void defaultScopesShouldReturnAzureRedisScopeForAzureUsGovernmentCloud() { + AzureRedisPasswordlessProperties properties = new AzureRedisPasswordlessProperties(); + properties.getProfile().setCloudType(AzureProfileOptionsProvider.CloudType.AZURE_US_GOVERNMENT); + assertEquals(REDIS_SCOPE_AZURE, properties.getScopes()); + } + + @Test + void passwordlessEnabledShouldDefaultToFalse() { + AzureRedisPasswordlessProperties properties = new AzureRedisPasswordlessProperties(); + assertFalse(properties.isPasswordlessEnabled()); + } +} + From 93e35dd558f9be84f8d453354e593647c9184b7c Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Fri, 10 Apr 2026 09:40:39 +0800 Subject: [PATCH 2/2] Remove unused imports --- .../properties/AzureRedisPasswordlessProperties.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessProperties.java index 2b83a90d1cbb..e18facb345a5 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/passwordless/properties/AzureRedisPasswordlessProperties.java @@ -6,10 +6,6 @@ import com.azure.spring.cloud.core.properties.PasswordlessProperties; import com.azure.spring.cloud.core.properties.authentication.TokenCredentialProperties; import com.azure.spring.cloud.core.properties.profile.AzureProfileProperties; -import com.azure.spring.cloud.core.provider.AzureProfileOptionsProvider; - -import java.util.HashMap; -import java.util.Map; /** * Configuration properties for passwordless connections with Azure Redis.