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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,6 @@ build/
.vscode/

/logs/

# Maven shade plugin generated files
dependency-reduced-pom.xml
50 changes: 49 additions & 1 deletion mi-sql-public-demo/src/main/java/com/example/MainSQL.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,42 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import java.sql.*;

import com.microsoft.sqlserver.jdbc.SQLServerDataSource;

public class MainSQL {

/**
* Simple placeholder resolver for ${VAR_NAME} and ${VAR_NAME:default} patterns
*/
private static String resolvePlaceholders(String input) {
if (input == null) return null;

Pattern pattern = Pattern.compile("\\$\\{([^}:]+)(?::([^}]*))?\\}");
Matcher matcher = pattern.matcher(input);
StringBuffer result = new StringBuffer();

while (matcher.find()) {
String varName = matcher.group(1);
String defaultValue = matcher.group(2);
String envValue = System.getenv(varName);

if (envValue != null) {
matcher.appendReplacement(result, Matcher.quoteReplacement(envValue));
} else if (defaultValue != null) {
matcher.appendReplacement(result, Matcher.quoteReplacement(defaultValue));
} else {
// Leave placeholder unresolved
matcher.appendReplacement(result, Matcher.quoteReplacement(matcher.group(0)));
}
}
matcher.appendTail(result);
return result.toString();
}

public static void main(String[] args) {

Expand All @@ -30,10 +59,29 @@ public static void main(String[] args) {
String connString = properties.getProperty("spring.datasource.url");

if (connString == null) {
System.out.println("spring.datasource.url property not found in application.properties");
System.out.println("ERROR: spring.datasource.url property not found in application.properties");
return;
}

// Resolve environment variable placeholders
connString = resolvePlaceholders(connString);

// Check for unresolved placeholders
if (connString.contains("${AZ_DATABASE_SERVER_NAME}")) {
System.out.println("ERROR: AZ_DATABASE_SERVER_NAME environment variable is not set");
System.out.println("Please set the AZ_DATABASE_SERVER_NAME environment variable to your Azure SQL server name");
return;
}

String clientId = properties.getProperty("spring.cloud.azure.credential.client-id");
if (clientId != null) {
clientId = resolvePlaceholders(clientId);
if (clientId.contains("${AZURE_CLIENT_ID}")) {
System.out.println("WARNING: AZURE_CLIENT_ID environment variable is not set");
System.out.println("This is required for user-assigned managed identity, but optional for system-assigned managed identity");
}
}

System.out.println("Connection string: " + connString);

SQLServerDataSource ds = new SQLServerDataSource();
Expand Down
4 changes: 2 additions & 2 deletions mi-sql-public-demo/src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Azure SQL Database configuration with Managed Identity
spring.datasource.url=jdbc:sqlserver://${AZ_DATABASE_SERVER_NAME}.database.windows.net:1433;database=demo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;authentication=ActiveDirectoryMSI
spring.datasource.url=jdbc:sqlserver://${AZ_DATABASE_SERVER_NAME}.database.windows.net:1433;database=${AZ_DATABASE_NAME:demo};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;authentication=ActiveDirectoryMSI

# Azure Managed Identity configuration
spring.cloud.azure.credential.managed-identity-enabled=true
spring.cloud.azure.credential.client-id=<your_managed_identity_client_id>
spring.cloud.azure.credential.client-id=${AZURE_CLIENT_ID}