diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java index 2b85d107a789..b861c1591525 100644 --- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java +++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java @@ -20,6 +20,7 @@ import org.apache.dubbo.common.constants.RemotingConstants; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.remoting.zookeeper.ZookeeperClient; import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter; @@ -52,6 +53,7 @@ public abstract class AbstractZookeeperTransporter implements ZookeeperTransport @Override public ZookeeperClient connect(URL url) { ZookeeperClient zookeeperClient; + // address format: {[username:password@]address} List addressList = getURLBackupAddress(url); // The field define the zookeeper server , including protocol, host, port, username, password if ((zookeeperClient = fetchAndUpdateZookeeperClientCache(addressList)) != null && zookeeperClient.isConnected()) { @@ -111,8 +113,29 @@ ZookeeperClient fetchAndUpdateZookeeperClientCache(List addressList) { List getURLBackupAddress(URL url) { List addressList = new ArrayList(); addressList.add(url.getAddress()); - addressList.addAll(url.getParameter(RemotingConstants.BACKUP_KEY, Collections.EMPTY_LIST)); + + String authPrefix = null; + if (StringUtils.isNotEmpty(url.getUsername())) { + StringBuilder buf = new StringBuilder(); + buf.append(url.getUsername()); + if (StringUtils.isNotEmpty(url.getPassword())) { + buf.append(":"); + buf.append(url.getPassword()); + } + buf.append("@"); + authPrefix = buf.toString(); + } + + if (StringUtils.isNotEmpty(authPrefix)) { + List authedAddressList = new ArrayList<>(addressList.size()); + for (String addr : addressList) { + authedAddressList.add(authPrefix + addr); + } + return authedAddressList; + } + + return addressList; } diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java index 43cf481c1c40..3662d8ffa552 100644 --- a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java +++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java @@ -205,4 +205,21 @@ public void testRepeatConnectForNoMatchBackUpAdd() throws Exception { zkServer2.stop(); zkServer3.stop(); } + + @Test + public void testSameHostWithDifferentUser() throws Exception { + int zkPort1 = NetUtils.getAvailablePort(); + int zkPort2 = NetUtils.getAvailablePort(); + try (TestingServer zkServer1 = new TestingServer(zkPort1, true)) { + try (TestingServer zkServer2 = new TestingServer(zkPort2, true)) { + URL url1 = URL.valueOf("zookeeper://us1:pw1@127.0.0.1:" + zkPort1 + "/path1"); + URL url2 = URL.valueOf("zookeeper://us2:pw2@127.0.0.1:" + zkPort1 + "/path2"); + + ZookeeperClient client1 = abstractZookeeperTransporter.connect(url1); + ZookeeperClient client2 = abstractZookeeperTransporter.connect(url2); + + assertThat(client1, not(client2)); + } + } + } }