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..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. @@ -17,16 +13,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 +34,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 +68,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()); + } +} +