This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/master by this push:
new 5ff9fa07b [SCB-2863]support zookeeper authentication (#4292)
5ff9fa07b is described below
commit 5ff9fa07b75151a5c9fac1dd98cb18e399153b69
Author: liubao68 <[email protected]>
AuthorDate: Tue Apr 2 20:37:43 2024 +0800
[SCB-2863]support zookeeper authentication (#4292)
---
.../config/zookeeper/ZookeeperClient.java | 48 +++++++++++++++++++--
.../config/zookeeper/ZookeeperConfig.java | 12 ++++++
.../registry/zookeeper/ZookeeperDiscovery.java | 48 +++++++++++++++++++--
.../registry/zookeeper/ZookeeperRegistration.java | 49 ++++++++++++++++++++--
.../zookeeper/ZookeeperRegistryProperties.java | 20 +++++++++
5 files changed, 168 insertions(+), 9 deletions(-)
diff --git
a/dynamic-config/config-zookeeper/src/main/java/org/apache/servicecomb/config/zookeeper/ZookeeperClient.java
b/dynamic-config/config-zookeeper/src/main/java/org/apache/servicecomb/config/zookeeper/ZookeeperClient.java
index 56d9ff7b8..32554923e 100644
---
a/dynamic-config/config-zookeeper/src/main/java/org/apache/servicecomb/config/zookeeper/ZookeeperClient.java
+++
b/dynamic-config/config-zookeeper/src/main/java/org/apache/servicecomb/config/zookeeper/ZookeeperClient.java
@@ -24,6 +24,9 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
+import javax.security.auth.login.AppConfigurationEntry;
+import javax.security.auth.login.Configuration;
+
import org.apache.commons.lang3.StringUtils;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -31,6 +34,7 @@ import
org.apache.curator.framework.recipes.cache.CuratorCache;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.servicecomb.config.BootStrapProperties;
import
org.apache.servicecomb.config.zookeeper.ZookeeperDynamicPropertiesSource.UpdateHandler;
+import org.apache.zookeeper.server.auth.DigestLoginModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
@@ -38,6 +42,29 @@ import org.springframework.core.env.Environment;
import org.springframework.core.io.ByteArrayResource;
public class ZookeeperClient {
+ static class ZookeeperSASLConfig extends Configuration {
+ AppConfigurationEntry entry;
+
+ public ZookeeperSASLConfig(String username,
+ String password) {
+ Map<String, String> options = new HashMap<>();
+ options.put("username", username);
+ options.put("password", password);
+ this.entry = new AppConfigurationEntry(
+ DigestLoginModule.class.getName(),
+ AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
+ options
+ );
+ }
+
+ @Override
+ public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
+ AppConfigurationEntry[] array = new AppConfigurationEntry[1];
+ array[0] = entry;
+ return array;
+ }
+ }
+
private static final Logger LOGGER =
LoggerFactory.getLogger(ZookeeperClient.class);
public static final String PATH_ENVIRONMENT =
"/servicecomb/config/environment/%s";
@@ -70,6 +97,7 @@ public class ZookeeperClient {
private Map<String, Object> allLast = new HashMap<>();
+
public ZookeeperClient(UpdateHandler updateHandler, Environment environment)
{
this.updateHandler = updateHandler;
this.zookeeperConfig = new ZookeeperConfig(environment);
@@ -77,9 +105,23 @@ public class ZookeeperClient {
}
public void refreshZookeeperConfig() throws Exception {
- CuratorFramework client =
CuratorFrameworkFactory.newClient(zookeeperConfig.getConnectString(),
- zookeeperConfig.getSessionTimeoutMillis(),
zookeeperConfig.getConnectionTimeoutMillis(),
- new ExponentialBackoffRetry(1000, 3));
+ CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()
+ .connectString(zookeeperConfig.getConnectString())
+ .sessionTimeoutMs(zookeeperConfig.getSessionTimeoutMillis())
+ .retryPolicy(new ExponentialBackoffRetry(1000, 3));
+ String authSchema = zookeeperConfig.getAuthSchema();
+ if (StringUtils.isNotEmpty(authSchema)) {
+ if (!"digest".equals(authSchema)) {
+ throw new IllegalStateException("Not supported schema now. " +
authSchema);
+ }
+ if (zookeeperConfig.getAuthInfo() == null) {
+ throw new IllegalStateException("Auth info can not be empty. ");
+ }
+
+ String[] authInfo = zookeeperConfig.getAuthInfo().split(":");
+ Configuration.setConfiguration(new ZookeeperSASLConfig(authInfo[0],
authInfo[1]));
+ }
+ CuratorFramework client = builder.build();
client.start();
String env = BootStrapProperties.readServiceEnvironment(environment);
diff --git
a/dynamic-config/config-zookeeper/src/main/java/org/apache/servicecomb/config/zookeeper/ZookeeperConfig.java
b/dynamic-config/config-zookeeper/src/main/java/org/apache/servicecomb/config/zookeeper/ZookeeperConfig.java
index 090ba15f3..074939c58 100644
---
a/dynamic-config/config-zookeeper/src/main/java/org/apache/servicecomb/config/zookeeper/ZookeeperConfig.java
+++
b/dynamic-config/config-zookeeper/src/main/java/org/apache/servicecomb/config/zookeeper/ZookeeperConfig.java
@@ -27,6 +27,10 @@ public class ZookeeperConfig {
public static final String PROPERTY_CONNECTION_TIMEOUT =
"servicecomb.config.zk.connection-timeout-mills";
+ public static final String PROPERTY_AUTH_SCHEMA =
"servicecomb.config.zk.authentication-schema";
+
+ public static final String PROPERTY_AUTH_INFO =
"servicecomb.config.zk.authentication-info";
+
private final Environment environment;
public ZookeeperConfig(Environment environment) {
@@ -44,4 +48,12 @@ public class ZookeeperConfig {
public int getConnectionTimeoutMillis() {
return environment.getProperty(PROPERTY_CONNECTION_TIMEOUT, int.class,
1000);
}
+
+ public String getAuthSchema() {
+ return environment.getProperty(PROPERTY_AUTH_SCHEMA);
+ }
+
+ public String getAuthInfo() {
+ return environment.getProperty(PROPERTY_AUTH_INFO);
+ }
}
diff --git
a/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperDiscovery.java
b/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperDiscovery.java
index fdd8ce078..4d871b3a1 100644
---
a/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperDiscovery.java
+++
b/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperDiscovery.java
@@ -16,12 +16,16 @@
*/
package org.apache.servicecomb.registry.zookeeper;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
+import javax.security.auth.login.AppConfigurationEntry;
+import javax.security.auth.login.Configuration;
+
import org.apache.commons.lang3.StringUtils;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -37,12 +41,36 @@ import
org.apache.curator.x.discovery.details.ServiceCacheListener;
import org.apache.servicecomb.config.BootStrapProperties;
import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
import org.apache.servicecomb.registry.api.Discovery;
+import org.apache.zookeeper.server.auth.DigestLoginModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
public class ZookeeperDiscovery implements
Discovery<ZookeeperDiscoveryInstance> {
+ static class ZookeeperSASLConfig extends Configuration {
+ AppConfigurationEntry entry;
+
+ public ZookeeperSASLConfig(String username,
+ String password) {
+ Map<String, String> options = new HashMap<>();
+ options.put("username", username);
+ options.put("password", password);
+ this.entry = new AppConfigurationEntry(
+ DigestLoginModule.class.getName(),
+ AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
+ options
+ );
+ }
+
+ @Override
+ public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
+ AppConfigurationEntry[] array = new AppConfigurationEntry[1];
+ array[0] = entry;
+ return array;
+ }
+ }
+
private static final Logger LOGGER =
LoggerFactory.getLogger(ZookeeperDiscovery.class);
private final Map<String, ServiceCache<ZookeeperInstance>>
serviceDiscoveries =
@@ -145,9 +173,23 @@ public class ZookeeperDiscovery implements
Discovery<ZookeeperDiscoveryInstance>
@Override
public void run() {
- client =
CuratorFrameworkFactory.newClient(zookeeperRegistryProperties.getConnectString(),
- zookeeperRegistryProperties.getSessionTimeoutMillis(),
zookeeperRegistryProperties.getConnectionTimeoutMillis(),
- new ExponentialBackoffRetry(1000, 3));
+ CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()
+ .connectString(zookeeperRegistryProperties.getConnectString())
+
.sessionTimeoutMs(zookeeperRegistryProperties.getSessionTimeoutMillis())
+ .retryPolicy(new ExponentialBackoffRetry(1000, 3));
+ String authSchema = zookeeperRegistryProperties.getAuthenticationSchema();
+ if (StringUtils.isNotEmpty(authSchema)) {
+ if (!"digest".equals(authSchema)) {
+ throw new IllegalStateException("Not supported schema now. " +
authSchema);
+ }
+ if (zookeeperRegistryProperties.getAuthenticationInfo() == null) {
+ throw new IllegalStateException("Auth info can not be empty. ");
+ }
+
+ String[] authInfo =
zookeeperRegistryProperties.getAuthenticationInfo().split(":");
+ Configuration.setConfiguration(new ZookeeperSASLConfig(authInfo[0],
authInfo[1]));
+ }
+ client = builder.build();
client.start();
}
diff --git
a/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperRegistration.java
b/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperRegistration.java
index e7c8c1aa6..1e819926a 100644
---
a/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperRegistration.java
+++
b/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperRegistration.java
@@ -16,8 +16,13 @@
*/
package org.apache.servicecomb.registry.zookeeper;
+import java.util.HashMap;
+import java.util.Map;
import java.util.UUID;
+import javax.security.auth.login.AppConfigurationEntry;
+import javax.security.auth.login.Configuration;
+
import org.apache.commons.lang3.StringUtils;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -32,10 +37,34 @@ import org.apache.servicecomb.config.DataCenterProperties;
import org.apache.servicecomb.registry.api.DataCenterInfo;
import org.apache.servicecomb.registry.api.MicroserviceInstanceStatus;
import org.apache.servicecomb.registry.api.Registration;
+import org.apache.zookeeper.server.auth.DigestLoginModule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
public class ZookeeperRegistration implements
Registration<ZookeeperRegistrationInstance> {
+ static class ZookeeperSASLConfig extends Configuration {
+ AppConfigurationEntry entry;
+
+ public ZookeeperSASLConfig(String username,
+ String password) {
+ Map<String, String> options = new HashMap<>();
+ options.put("username", username);
+ options.put("password", password);
+ this.entry = new AppConfigurationEntry(
+ DigestLoginModule.class.getName(),
+ AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
+ options
+ );
+ }
+
+ @Override
+ public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
+ AppConfigurationEntry[] array = new AppConfigurationEntry[1];
+ array[0] = entry;
+ return array;
+ }
+ }
+
private Environment environment;
private ZookeeperRegistryProperties zookeeperRegistryProperties;
@@ -99,9 +128,23 @@ public class ZookeeperRegistration implements
Registration<ZookeeperRegistration
@Override
public void run() {
- client =
CuratorFrameworkFactory.newClient(zookeeperRegistryProperties.getConnectString(),
- zookeeperRegistryProperties.getSessionTimeoutMillis(),
zookeeperRegistryProperties.getConnectionTimeoutMillis(),
- new ExponentialBackoffRetry(1000, 3));
+ CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()
+ .connectString(zookeeperRegistryProperties.getConnectString())
+
.sessionTimeoutMs(zookeeperRegistryProperties.getSessionTimeoutMillis())
+ .retryPolicy(new ExponentialBackoffRetry(1000, 3));
+ String authSchema = zookeeperRegistryProperties.getAuthenticationSchema();
+ if (StringUtils.isNotEmpty(authSchema)) {
+ if (!"digest".equals(authSchema)) {
+ throw new IllegalStateException("Not supported schema now. " +
authSchema);
+ }
+ if (zookeeperRegistryProperties.getAuthenticationInfo() == null) {
+ throw new IllegalStateException("Auth info can not be empty. ");
+ }
+
+ String[] authInfo =
zookeeperRegistryProperties.getAuthenticationInfo().split(":");
+ Configuration.setConfiguration(new
ZookeeperDiscovery.ZookeeperSASLConfig(authInfo[0], authInfo[1]));
+ }
+ client = builder.build();
client.start();
JsonInstanceSerializer<ZookeeperInstance> serializer =
new JsonInstanceSerializer<>(ZookeeperInstance.class);
diff --git
a/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperRegistryProperties.java
b/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperRegistryProperties.java
index f1fa0a773..cea946d99 100644
---
a/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperRegistryProperties.java
+++
b/service-registry/registry-zookeeper/src/main/java/org/apache/servicecomb/registry/zookeeper/ZookeeperRegistryProperties.java
@@ -23,6 +23,10 @@ public class ZookeeperRegistryProperties {
private String connectString = "zookeeper://127.0.0.1:2181";
+ private String authenticationSchema;
+
+ private String authenticationInfo;
+
private int connectionTimeoutMillis = 1000;
private int sessionTimeoutMillis = 60000;
@@ -76,4 +80,20 @@ public class ZookeeperRegistryProperties {
public void setEnableSwaggerRegistration(boolean enableSwaggerRegistration) {
this.enableSwaggerRegistration = enableSwaggerRegistration;
}
+
+ public String getAuthenticationSchema() {
+ return authenticationSchema;
+ }
+
+ public void setAuthenticationSchema(String authenticationSchema) {
+ this.authenticationSchema = authenticationSchema;
+ }
+
+ public String getAuthenticationInfo() {
+ return authenticationInfo;
+ }
+
+ public void setAuthenticationInfo(String authenticationInfo) {
+ this.authenticationInfo = authenticationInfo;
+ }
}