add authorization for zookeeper group (#208)

* add authorization for zookeeper group

* change registry name

* change properties's key name

* retry
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
index 6715cab..6d527ff 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
@@ -19,9 +19,7 @@
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.admin.common.exception.ConfigurationException;
-import org.apache.dubbo.admin.common.exception.ParamValidationException;
 import org.apache.dubbo.admin.common.util.Constants;
-import org.apache.dubbo.admin.controller.AccessesController;
 import org.apache.dubbo.admin.data.config.GovernanceConfiguration;
 import org.apache.dubbo.admin.data.metadata.MetaDataCollector;
 import org.apache.dubbo.admin.data.metadata.impl.NoOpMetadataCollector;
@@ -45,14 +43,18 @@
 
     @Value("${dubbo.config-center:}")
     private String configCenter;
+    @Value("${dubbo.config-center.username:}")
+    private String username;
+    @Value("${dubbo.config-center.password:}")
+    private String password;
 
     @Value("${dubbo.registry.address:}")
     private String registryAddress;
+    @Value("${dubbo.registry.group:}")
+    private String group;
 
     private static String globalConfigPath = "config/dubbo/dubbo.properties";
 
-    @Value("${dubbo.registry.group:}")
-    private String group;
     private static final Logger logger = LoggerFactory.getLogger(ConfigCenter.class);
 
     private URL configCenterUrl;
@@ -68,7 +70,7 @@
         GovernanceConfiguration dynamicConfiguration = null;
 
         if (StringUtils.isNotEmpty(configCenter)) {
-            configCenterUrl = formUrl(configCenter, group);
+            configCenterUrl = formUrl(configCenter, group, username, password);
             dynamicConfiguration = ExtensionLoader.getExtensionLoader(GovernanceConfiguration.class).getExtension(configCenterUrl.getProtocol());
             dynamicConfiguration.setUrl(configCenterUrl);
             dynamicConfiguration.init();
@@ -77,16 +79,16 @@
             if (StringUtils.isNotEmpty(config)) {
                 Arrays.stream(config.split("\n")).forEach( s -> {
                     if(s.startsWith(Constants.REGISTRY_ADDRESS)) {
-                        registryUrl = formUrl(s.split("=")[1].trim(), group);
+                        registryUrl = formUrl(s.split("=")[1].trim(), group, username, password);
                     } else if (s.startsWith(Constants.METADATA_ADDRESS)) {
-                        metadataUrl = formUrl(s.split("=")[1].trim(), group);
+                        metadataUrl = formUrl(s.split("=")[1].trim(), group, username, password);
                     }
                 });
             }
         }
         if (dynamicConfiguration == null) {
             if (StringUtils.isNotEmpty(registryAddress)) {
-                registryUrl = formUrl(registryAddress, group);
+                registryUrl = formUrl(registryAddress, group, username, password);
                 dynamicConfiguration = ExtensionLoader.getExtensionLoader(GovernanceConfiguration.class).getExtension(registryUrl.getProtocol());
                 dynamicConfiguration.setUrl(registryUrl);
                 dynamicConfiguration.init();
@@ -110,7 +112,7 @@
             if (StringUtils.isBlank(registryAddress)) {
                 throw new ConfigurationException("Either config center or registry address is needed, please refer to https://github.com/apache/incubator-dubbo-ops/wiki/Dubbo-Admin-configuration");
             }
-            registryUrl = formUrl(registryAddress, group);
+            registryUrl = formUrl(registryAddress, group, username, password);
         }
         RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
         registry = registryFactory.getRegistry(registryUrl);
@@ -134,10 +136,16 @@
         return metaDataCollector;
     }
 
-    private URL formUrl(String config, String group) {
+    private URL formUrl(String config, String group, String username, String password) {
         URL url = URL.valueOf(config);
         if (StringUtils.isNotEmpty(group)) {
-            url.addParameter(org.apache.dubbo.common.Constants.GROUP_KEY, group);
+            url = url.addParameter(org.apache.dubbo.common.Constants.GROUP_KEY, group);
+        }
+        if (StringUtils.isNotEmpty(username)) {
+            url = url.setUsername(username);
+        }
+        if (StringUtils.isNotEmpty(password)) {
+            url = url.setPassword(password);
         }
         return url;
     }
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java
index c0540d5..ffe4b49 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java
@@ -17,6 +17,7 @@
 
 package org.apache.dubbo.admin.data.config.impl;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.ExponentialBackoffRetry;
@@ -45,7 +46,15 @@
 
     @Override
     public void init() {
-        zkClient = CuratorFrameworkFactory.newClient(url.getAddress(), new ExponentialBackoffRetry(1000, 3));
+        CuratorFrameworkFactory.Builder zkClientBuilder = CuratorFrameworkFactory.builder().
+                connectString(url.getAddress()).
+                retryPolicy(new ExponentialBackoffRetry(1000, 3));
+        if(StringUtils.isNotEmpty(url.getUsername()) && StringUtils.isNotEmpty(url.getPassword())){
+            // add authorization
+            String auth = url.getUsername() + ":" + url.getPassword();
+            zkClientBuilder.authorization("digest", auth.getBytes());
+        }
+        zkClient = zkClientBuilder.build();
         String group = url.getParameter(Constants.GROUP_KEY, Constants.DEFAULT_ROOT);
         if (!group.startsWith(Constants.PATH_SEPARATOR)) {
             group = Constants.PATH_SEPARATOR + group;
diff --git a/dubbo-admin-backend/src/main/resources/application.properties b/dubbo-admin-backend/src/main/resources/application.properties
index 687e7a3..28fa8d0 100644
--- a/dubbo-admin-backend/src/main/resources/application.properties
+++ b/dubbo-admin-backend/src/main/resources/application.properties
@@ -15,8 +15,10 @@
 # limitations under the License.
 #
 
-dubbo.registry.group=dubbo
+dubbo.config-center.username=username
+dubbo.config-center.password=password
 dubbo.config-center=zookeeper://127.0.0.1:2181
+dubbo.registry.group=dubbo
 dubbo.registry.address=zookeeper://127.0.0.1:2181
 dubbo.apollo.token=e16e5cd903fd0c97a116c873b448544b9d086de9
 dubbo.apollo.appId=test