Merge pull request #38839 from onobc

* pr/38839:
  Polish 'Use authParamString to configure Pulsar authentication'
  Use authParamString to configure Pulsar authentication

Closes gh-38839
This commit is contained in:
Phillip Webb
2023-12-16 22:23:47 -08:00
2 changed files with 19 additions and 5 deletions

View File

@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.pulsar;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
@@ -29,6 +30,7 @@ import org.apache.pulsar.client.api.ConsumerBuilder;
import org.apache.pulsar.client.api.ProducerBuilder;
import org.apache.pulsar.client.api.PulsarClientException.UnsupportedAuthenticationException;
import org.apache.pulsar.client.api.ReaderBuilder;
import org.apache.pulsar.common.util.ObjectMapperFactory;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.pulsar.listener.PulsarContainerProperties;
@@ -73,7 +75,8 @@ final class PulsarPropertiesMapper {
PulsarProperties.Authentication properties) {
if (StringUtils.hasText(properties.getPluginClassName())) {
try {
authentication.accept(properties.getPluginClassName(), properties.getParam());
authentication.accept(properties.getPluginClassName(),
getAuthenticationParamsJson(properties.getParam()));
}
catch (UnsupportedAuthenticationException ex) {
throw new IllegalStateException("Unable to configure Pulsar authentication", ex);
@@ -81,6 +84,16 @@ final class PulsarPropertiesMapper {
}
}
private String getAuthenticationParamsJson(Map<String, String> params) {
Map<String, String> sortedParams = new TreeMap<>(params);
try {
return ObjectMapperFactory.create().writeValueAsString(sortedParams);
}
catch (Exception ex) {
throw new IllegalStateException("Could not convert auth parameters to encoded string", ex);
}
}
<T> void customizeProducerBuilder(ProducerBuilder<T> producerBuilder) {
PulsarProperties.Producer properties = this.properties.getProducer();
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
@@ -158,8 +171,7 @@ final class PulsarPropertiesMapper {
private interface AuthenticationConsumer {
void accept(String authPluginClassName, Map<String, String> authParams)
throws UnsupportedAuthenticationException;
void accept(String authPluginClassName, String authParamString) throws UnsupportedAuthenticationException;
}

View File

@@ -73,12 +73,13 @@ class PulsarPropertiesMapperTests {
void customizeClientBuilderWhenHasAuthentication() throws UnsupportedAuthenticationException {
PulsarProperties properties = new PulsarProperties();
Map<String, String> params = Map.of("param", "name");
String authParamString = "{\"param\":\"name\"}";
properties.getClient().getAuthentication().setPluginClassName("myclass");
properties.getClient().getAuthentication().setParam(params);
ClientBuilder builder = mock(ClientBuilder.class);
new PulsarPropertiesMapper(properties).customizeClientBuilder(builder,
new PropertiesPulsarConnectionDetails(properties));
then(builder).should().authentication("myclass", params);
then(builder).should().authentication("myclass", authParamString);
}
@Test
@@ -112,12 +113,13 @@ class PulsarPropertiesMapperTests {
void customizeAdminBuilderWhenHasAuthentication() throws UnsupportedAuthenticationException {
PulsarProperties properties = new PulsarProperties();
Map<String, String> params = Map.of("param", "name");
String authParamString = "{\"param\":\"name\"}";
properties.getAdmin().getAuthentication().setPluginClassName("myclass");
properties.getAdmin().getAuthentication().setParam(params);
PulsarAdminBuilder builder = mock(PulsarAdminBuilder.class);
new PulsarPropertiesMapper(properties).customizeAdminBuilder(builder,
new PropertiesPulsarConnectionDetails(properties));
then(builder).should().authentication("myclass", params);
then(builder).should().authentication("myclass", authParamString);
}
@Test