Use authParamString to configure Pulsar authentication

Update `PulsarPropertiesMapper` to use JSON encoded parameters rather
than a `Map` since the `Map` method is deprecated in Pulsar. This
commit simply takes the auth params map and converts them to the
expected encoded JSON string of auth parameters.

See gh-38839
This commit is contained in:
Chris Bono 2023-12-15 23:48:11 -06:00 committed by Phillip Webb
parent 6ae113c18a
commit 4c0a19e8c0
2 changed files with 21 additions and 8 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;
@ -71,13 +73,23 @@ final class PulsarPropertiesMapper {
private void customizeAuthentication(AuthenticationConsumer authentication,
PulsarProperties.Authentication properties) {
if (StringUtils.hasText(properties.getPluginClassName())) {
if (!StringUtils.hasText(properties.getPluginClassName())) {
return;
}
try {
// sort keys for testing and readability
Map<String, String> params = new TreeMap<>(properties.getParam());
String authParamString;
try {
authentication.accept(properties.getPluginClassName(), properties.getParam());
authParamString = ObjectMapperFactory.create().writeValueAsString(params);
}
catch (UnsupportedAuthenticationException ex) {
throw new IllegalStateException("Unable to configure Pulsar authentication", ex);
catch (Exception ex) {
throw new IllegalStateException("Could not convert auth parameters to encoded string", ex);
}
authentication.accept(properties.getPluginClassName(), authParamString);
}
catch (UnsupportedAuthenticationException ex) {
throw new IllegalStateException("Unable to configure Pulsar authentication", ex);
}
}
@ -158,8 +170,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