diff --git a/.gitignore b/.gitignore index 6aa4d54cb..ae9ec88aa 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ test/logs derby.log yarn.lock .flattened-pom.xml +lefthook.yml diff --git a/api/src/main/java/com/alibaba/nacos/api/PropertyKeyConst.java b/api/src/main/java/com/alibaba/nacos/api/PropertyKeyConst.java index e6a1917a2..fe27f27ca 100644 --- a/api/src/main/java/com/alibaba/nacos/api/PropertyKeyConst.java +++ b/api/src/main/java/com/alibaba/nacos/api/PropertyKeyConst.java @@ -95,6 +95,11 @@ public class PropertyKeyConst { public static final String LOG_ALL_PROPERTIES = "logAllProperties"; + /** + * Since 2.3.3, For some situation like java agent using nacos-client which can't use env ram info. + */ + public static final String IS_USE_RAM_INFO_PARSING = "isUseRamInfoParsing"; + /** * Get the key value of some variable value from the system property. */ diff --git a/api/src/main/java/com/alibaba/nacos/api/SystemPropertyKeyConst.java b/api/src/main/java/com/alibaba/nacos/api/SystemPropertyKeyConst.java index 3eac8aaa1..f24138daf 100644 --- a/api/src/main/java/com/alibaba/nacos/api/SystemPropertyKeyConst.java +++ b/api/src/main/java/com/alibaba/nacos/api/SystemPropertyKeyConst.java @@ -46,4 +46,9 @@ public interface SystemPropertyKeyConst { * It is also supported by the -D parameter. */ String IS_USE_ENDPOINT_PARSING_RULE = "nacos.use.endpoint.parsing.rule"; + + /** + * Since 2.3.3, For some situation like java agent using nacos-client which can't use env ram info. + */ + String IS_USE_RAM_INFO_PARSING = "nacos.use.ram.info.parsing"; } diff --git a/api/src/main/java/com/alibaba/nacos/api/common/Constants.java b/api/src/main/java/com/alibaba/nacos/api/common/Constants.java index 9e9820a55..0bb32558b 100644 --- a/api/src/main/java/com/alibaba/nacos/api/common/Constants.java +++ b/api/src/main/java/com/alibaba/nacos/api/common/Constants.java @@ -247,6 +247,11 @@ public class Constants { public static final String CONFIG_GRAY_LABEL = "nacos.config.gray.label"; + /** + * Since 2.3.3, For some situation like java agent using nacos-client which can't use env ram info. + */ + public static final String DEFAULT_USE_RAM_INFO_PARSING = "true"; + /** * The constants in config directory. */ diff --git a/client/src/main/java/com/alibaba/nacos/client/auth/ram/RamClientAuthServiceImpl.java b/client/src/main/java/com/alibaba/nacos/client/auth/ram/RamClientAuthServiceImpl.java index 73ffc18b1..e66565d08 100644 --- a/client/src/main/java/com/alibaba/nacos/client/auth/ram/RamClientAuthServiceImpl.java +++ b/client/src/main/java/com/alibaba/nacos/client/auth/ram/RamClientAuthServiceImpl.java @@ -22,6 +22,7 @@ import com.alibaba.nacos.client.auth.ram.identify.StsConfig; import com.alibaba.nacos.client.auth.ram.injector.AbstractResourceInjector; import com.alibaba.nacos.client.auth.ram.injector.ConfigResourceInjector; import com.alibaba.nacos.client.auth.ram.injector.NamingResourceInjector; +import com.alibaba.nacos.client.auth.ram.utils.RamUtil; import com.alibaba.nacos.client.auth.ram.utils.SpasAdapter; import com.alibaba.nacos.common.utils.StringUtils; import com.alibaba.nacos.plugin.auth.api.LoginIdentityContext; @@ -76,13 +77,11 @@ public class RamClientAuthServiceImpl extends AbstractClientAuthService { } private void loadAccessKey(Properties properties) { - String accessKey = properties.getProperty(PropertyKeyConst.ACCESS_KEY); - ramContext.setAccessKey(StringUtils.isBlank(accessKey) ? SpasAdapter.getAk() : accessKey); + ramContext.setAccessKey(RamUtil.getAccessKey(properties)); } private void loadSecretKey(Properties properties) { - String secretKey = properties.getProperty(PropertyKeyConst.SECRET_KEY); - ramContext.setSecretKey(StringUtils.isBlank(secretKey) ? SpasAdapter.getSk() : secretKey); + ramContext.setSecretKey(RamUtil.getSecretKey(properties)); } private void loadRegionId(Properties properties) { diff --git a/client/src/main/java/com/alibaba/nacos/client/auth/ram/utils/RamUtil.java b/client/src/main/java/com/alibaba/nacos/client/auth/ram/utils/RamUtil.java new file mode 100644 index 000000000..ee3db5018 --- /dev/null +++ b/client/src/main/java/com/alibaba/nacos/client/auth/ram/utils/RamUtil.java @@ -0,0 +1,58 @@ +/* + * Copyright 1999-2023 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.client.auth.ram.utils; + +import com.alibaba.nacos.api.PropertyKeyConst; +import com.alibaba.nacos.api.SystemPropertyKeyConst; +import com.alibaba.nacos.api.common.Constants; +import com.alibaba.nacos.common.utils.StringUtils; + +import java.util.Properties; + +/** + * Util to get ram info, such as AK, SK and RAM role. + * + * @author xiweng.yy + */ +public class RamUtil { + + public static String getAccessKey(Properties properties) { + boolean isUseRamInfoParsing = Boolean.parseBoolean(properties + .getProperty(PropertyKeyConst.IS_USE_RAM_INFO_PARSING, + System.getProperty(SystemPropertyKeyConst.IS_USE_RAM_INFO_PARSING, + Constants.DEFAULT_USE_RAM_INFO_PARSING))); + + String result = properties.getProperty(PropertyKeyConst.ACCESS_KEY); + if (isUseRamInfoParsing && StringUtils.isBlank(result)) { + result = SpasAdapter.getAk(); + } + return result; + } + + public static String getSecretKey(Properties properties) { + boolean isUseRamInfoParsing = Boolean.parseBoolean(properties + .getProperty(PropertyKeyConst.IS_USE_RAM_INFO_PARSING, + System.getProperty(SystemPropertyKeyConst.IS_USE_RAM_INFO_PARSING, + Constants.DEFAULT_USE_RAM_INFO_PARSING))); + + String result = properties.getProperty(PropertyKeyConst.SECRET_KEY); + if (isUseRamInfoParsing && StringUtils.isBlank(result)) { + result = SpasAdapter.getSk(); + } + return result; + } +} diff --git a/client/src/test/java/com/alibaba/nacos/client/auth/ram/utils/RamUtilTest.java b/client/src/test/java/com/alibaba/nacos/client/auth/ram/utils/RamUtilTest.java new file mode 100644 index 000000000..1e767042b --- /dev/null +++ b/client/src/test/java/com/alibaba/nacos/client/auth/ram/utils/RamUtilTest.java @@ -0,0 +1,69 @@ +/* + * Copyright 1999-2023 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.client.auth.ram.utils; + +import com.alibaba.nacos.api.PropertyKeyConst; +import com.alibaba.nacos.client.auth.ram.identify.CredentialService; +import com.alibaba.nacos.client.auth.ram.identify.Credentials; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Properties; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class RamUtilTest { + + private Properties properties; + + @BeforeEach + public void setUp() throws Exception { + SpasAdapter.freeCredentialInstance(); + Credentials credentials = new Credentials("spasAk", "spasSk", "spasNamespaceId"); + CredentialService.getInstance().setStaticCredential(credentials); + properties = new Properties(); + properties.setProperty(PropertyKeyConst.ACCESS_KEY, "userAk"); + properties.setProperty(PropertyKeyConst.SECRET_KEY, "userSk"); + } + + @AfterEach + public void tearDown() throws Exception { + SpasAdapter.freeCredentialInstance(); + } + + @Test + public void testGetAccessKeyWithUserAkSk() { + assertEquals("userAk", RamUtil.getAccessKey(properties)); + assertEquals("userSk", RamUtil.getSecretKey(properties)); + } + + @Test + public void testGetAccessKeyWithSpasAkSk() { + assertEquals("spasAk", RamUtil.getAccessKey(new Properties())); + assertEquals("spasSk", RamUtil.getSecretKey(new Properties())); + } + + @Test + public void testGetAccessKeyWithoutSpasAkSk() { + Properties properties1 = new Properties(); + properties1.setProperty(PropertyKeyConst.IS_USE_RAM_INFO_PARSING, "false"); + assertNull(RamUtil.getAccessKey(properties1)); + assertNull(RamUtil.getSecretKey(properties1)); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 947e4eafc..98e9cdae2 100644 --- a/pom.xml +++ b/pom.xml @@ -361,6 +361,7 @@ **/filter-config.json **/disk_cache_test/** **/failover_test/** + lefthook.yml