diff --git a/spring-core/src/main/java/org/springframework/core/io/UrlResource.java b/spring-core/src/main/java/org/springframework/core/io/UrlResource.java index a317ac93fc1..57685795e26 100644 --- a/spring-core/src/main/java/org/springframework/core/io/UrlResource.java +++ b/spring-core/src/main/java/org/springframework/core/io/UrlResource.java @@ -28,6 +28,7 @@ import java.net.URL; import java.net.URLConnection; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; +import java.util.Base64; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -46,6 +47,8 @@ import org.springframework.util.StringUtils; */ public class UrlResource extends AbstractFileResolvingResource { + private static final String AUTHORIZATION = "Authorization"; + /** * Original URI, if available; used for URI and File access. */ @@ -237,6 +240,16 @@ public class UrlResource extends AbstractFileResolvingResource { } } + @Override + protected void customizeConnection(URLConnection con) throws IOException { + super.customizeConnection(con); + String userInfo = this.url.getUserInfo(); + if (userInfo != null) { + String encodedCredentials = Base64.getUrlEncoder().encodeToString(userInfo.getBytes()); + con.setRequestProperty(AUTHORIZATION, "Basic " + encodedCredentials); + } + } + /** * This implementation returns the underlying URL reference. */ diff --git a/spring-core/src/test/java/org/springframework/core/io/ResourceTests.java b/spring-core/src/test/java/org/springframework/core/io/ResourceTests.java index 031fc7c7e42..bf3a2465019 100644 --- a/spring-core/src/test/java/org/springframework/core/io/ResourceTests.java +++ b/spring-core/src/test/java/org/springframework/core/io/ResourceTests.java @@ -33,6 +33,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Base64; import java.util.stream.Stream; import okhttp3.mockwebserver.Dispatcher; @@ -377,6 +378,19 @@ class ResourceTests { assertThat(request.getHeader("Framework-Name")).isEqualTo("Spring"); } + @Test + void useUserInfoToSetBasicAuth() throws Exception { + startServer(); + UrlResource resource = new UrlResource("http://alice:secret@localhost:" + + this.server.getPort() + "/resource"); + assertThat(resource.getInputStream()).hasContent("Spring"); + RecordedRequest request = this.server.takeRequest(); + String authorization = request.getHeader("Authorization"); + assertThat(authorization).isNotNull().startsWith("Basic "); + assertThat(new String(Base64.getDecoder().decode( + authorization.substring(6)), StandardCharsets.ISO_8859_1)).isEqualTo("alice:secret"); + } + @AfterEach void shutdown() throws Exception { this.server.shutdown();