Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion sdk/spring/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Comment thread
rujche marked this conversation as resolved.
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.)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,13 @@
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.
*/
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<CloudType, String> REDIS_SCOPE_MAP = new HashMap<CloudType, String>() {
{
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();

Expand All @@ -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;
}
Comment thread
rujche marked this conversation as resolved.

/**
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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());
}
}

Loading