Skip to content

Commit cc16966

Browse files
committed
✨ Added SSL Support for Spring RestClient RestClient
1 parent 28e4981 commit cc16966

File tree

4 files changed

+70
-14
lines changed

4 files changed

+70
-14
lines changed

spring/fluentforms-spring-boot-autoconfigure/src/main/java/com/_4point/aem/fluentforms/spring/FluentFormsAutoConfiguration.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
package com._4point.aem.fluentforms.spring;
22

33
import java.io.InputStream;
4+
import java.util.function.Consumer;
45
import java.util.function.Function;
56

67
import org.springframework.beans.factory.annotation.Autowired;
78
import org.springframework.boot.autoconfigure.AutoConfiguration;
89
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
910
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1011
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
12+
import org.springframework.boot.autoconfigure.web.client.RestClientSsl;
1113
import org.springframework.boot.context.properties.EnableConfigurationProperties;
14+
import org.springframework.boot.ssl.NoSuchSslBundleException;
1215
import org.springframework.boot.ssl.SslBundles;
1316
import org.springframework.context.annotation.Bean;
1417
import org.springframework.context.annotation.Configuration;
1518
import org.springframework.context.annotation.Lazy;
19+
import org.springframework.web.client.RestClient;
1620

1721
import com._4point.aem.docservices.rest_services.client.af.AdaptiveFormsService;
1822
import com._4point.aem.docservices.rest_services.client.assembler.RestServicesDocAssemblerServiceAdapter;
@@ -79,11 +83,22 @@ private <T extends Builder> T setAemFields(T builder, AemConfiguration aemConfig
7983
@ConditionalOnProperty(prefix="fluentforms", name="restclient", havingValue="springrestclient", matchIfMissing=false )
8084
@ConditionalOnMissingBean
8185
@Bean
82-
public RestClientFactory springRestClientFactory(AemConfiguration aemConfig, @Autowired(required = false) SslBundles sslBundles) {
83-
// TODO: Figure out how to configure Spring RestClient with SSL bundle (if required - it may not be)
84-
return SpringRestClientRestClient.factory(); // Create a RestClientFactory using Spring RestClient implementation
86+
public RestClientFactory springRestClientFactory(AemConfiguration aemConfig, RestClient.Builder restClientBuilder, RestClientSsl restClientSsl) {
87+
return SpringRestClientRestClient.factory(aemConfig.useSsl() ? restClientBuilder.apply(getSslBundle(aemConfig.sslBundle(), restClientSsl))
88+
: restClientBuilder
89+
); // Create a RestClientFactory using Spring RestClient implementation
8590
}
8691

92+
93+
private Consumer<org.springframework.web.client.RestClient.Builder> getSslBundle(String sslBundleName, RestClientSsl restClientSsl) {
94+
try {
95+
return restClientSsl.fromBundle(sslBundleName);
96+
} catch (NoSuchSslBundleException e) {
97+
// Default to normal SSL context (which includes the default trust store)
98+
return b->{}; // No-op;
99+
}
100+
}
101+
87102
@Configuration(proxyBeanMethods = false)
88103
@ConditionalOnClass(org.glassfish.jersey.client.JerseyClient.class)
89104
public static class JerseyRestClientConfiguration {

spring/fluentforms-spring-boot-autoconfigure/src/main/java/com/_4point/aem/fluentforms/spring/JerseyClientFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public static Client createClient(SslBundles sslBundles, String bundleName) {
3535
return ClientBuilder.newBuilder().sslContext(sslContext).build();
3636
} catch (NoSuchSslBundleException e) {
3737
// Eat the exception and fall through to the default client
38+
// Default the SSL context (which includes the default trust store)
3839
}
3940
}
4041
logger.info("Creating default client");

spring/fluentforms-spring-boot-autoconfigure/src/main/java/com/_4point/aem/fluentforms/spring/rest_services/client/SpringRestClientRestClient.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@ public class SpringRestClientRestClient implements RestClient {
3434
private final String target;
3535
private final Supplier<String> correlationIdFn;
3636

37-
private SpringRestClientRestClient(AemConfig aemConfig, String target, Supplier<String> correlationIdFn) {
38-
this(createSpringRestClient(aemConfig, target), getTarget(aemConfig, target), correlationIdFn);
39-
}
40-
4137
private SpringRestClientRestClient(org.springframework.web.client.RestClient springRestClient, String target, Supplier<String> correlationIdFn) {
4238
this.springRestClient = springRestClient;
4339
this.target = target;
@@ -65,16 +61,24 @@ public RestClient.GetRequest.Builder getRequestBuilder(String additionalPath) {
6561
}
6662

6763
public static RestClientFactory factory() {
68-
return (aemConfig, target, correlationIdFn)->new SpringRestClientRestClient(aemConfig, target, correlationIdFn);
64+
return factory(org.springframework.web.client.RestClient.builder());
65+
}
66+
67+
public static RestClientFactory factory(org.springframework.web.client.RestClient.Builder builder) {
68+
return (aemConfig, target, correlationIdFn) ->
69+
new SpringRestClientRestClient(createSpringRestClient(aemConfig, target, builder), target, correlationIdFn);
6970
}
7071

71-
private static org.springframework.web.client.RestClient createSpringRestClient(AemConfig aemConfig, String target) {
72+
private static org.springframework.web.client.RestClient createSpringRestClient(
73+
AemConfig aemConfig,
74+
String target,
75+
org.springframework.web.client.RestClient.Builder builder
76+
) {
7277
ClientHttpRequestInterceptor basicAuth = new BasicAuthenticationInterceptor(aemConfig.user(), aemConfig.password());
73-
74-
return org.springframework.web.client.RestClient.builder()
75-
.baseUrl(getTarget(aemConfig, target))
76-
.requestInterceptor(basicAuth)
77-
.build();
78+
79+
return builder.baseUrl(getTarget(aemConfig, target))
80+
.requestInterceptor(basicAuth)
81+
.build();
7882
}
7983

8084
private static String getTarget(AemConfig aemConfig, String additionalPath) {

spring/fluentforms-spring-boot-autoconfigure/src/test/java/com/_4point/aem/fluentforms/spring/FluentFormsAutoConfigurationTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,42 @@ void testRestClientFactory(@Autowired RestClientFactory factory, @Autowired AemC
175175
}
176176
}
177177

178+
@SpringBootTest(classes = {com._4point.aem.fluentforms.spring.FluentFormsAutoConfigurationTest.TestApplication.class, FluentFormsAutoConfiguration.class},
179+
properties = {
180+
"fluentforms.aem.servername=localhost",
181+
"fluentforms.aem.port=4502",
182+
"fluentforms.aem.user=admin",
183+
"fluentforms.aem.password=admin",
184+
"fluentforms.aem.usessl=true",
185+
"fluentforms.restclient=springrestclient" // Configure for Spring RestClient
186+
})
187+
public static class SpringRestClient_SslNoBundleTest {
188+
189+
@Test
190+
void testRestClientFactory(@Autowired RestClientFactory factory, @Autowired AemConfiguration config) {
191+
RestClient client = factory.apply(toAemConfig(config) , "testRestClientFactory", ()->"correlationId");
192+
assertTrue(client instanceof SpringRestClientRestClient, "RestClientFactory should return a SpringRestClientRestClient when configured to do so");
193+
}
194+
}
195+
196+
@SpringBootTest(classes = {com._4point.aem.fluentforms.spring.FluentFormsAutoConfigurationTest.TestApplication.class, FluentFormsAutoConfiguration.class},
197+
properties = {
198+
"fluentforms.aem.servername=localhost",
199+
"fluentforms.aem.port=4502",
200+
"fluentforms.aem.user=admin",
201+
"fluentforms.aem.password=admin",
202+
"fluentforms.aem.usessl=true",
203+
"fluentforms.restclient=jersey" // Configure for Jersey RestClient
204+
})
205+
public static class JserseyRestClient_SslBundleTest {
206+
207+
@Test
208+
void testRestClientFactory(@Autowired RestClientFactory factory, @Autowired AemConfiguration config) {
209+
RestClient client = factory.apply(toAemConfig(config) , "testRestClientFactory", ()->"correlationId");
210+
assertTrue(client instanceof JerseyRestClient, "RestClientFactory should return a JerseyRestClient when configured to do so");
211+
}
212+
}
213+
178214
private static AemConfig toAemConfig(AemConfiguration config) {
179215
return new AemConfig() {
180216

0 commit comments

Comments
 (0)