This is an automated email from the ASF dual-hosted git repository.
dockerzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/inlong.git
The following commit(s) were added to refs/heads/master by this push:
new 5fb7cd4d9 [INLONG-5167][Manager][Agent][Dataproxy][SDK] Manager open
API authentication support (#5173)
5fb7cd4d9 is described below
commit 5fb7cd4d9c1ff203acc75a9500f295403c38379e
Author: woofyzhao <[email protected]>
AuthorDate: Sun Jul 24 16:13:20 2022 +0800
[INLONG-5167][Manager][Agent][Dataproxy][SDK] Manager open API
authentication support (#5173)
---
.../inlong/agent/constant/FetcherConstants.java | 2 +
.../org/apache/inlong/agent/utils/HttpManager.java | 9 +++
.../agent-core/src/test/resources/agent.properties | 2 +
.../inlong/agent/plugin/sinks/SenderManager.java | 8 +-
.../src/test/resources/agent.properties | 4 +-
inlong-agent/conf/agent.properties | 2 +
.../org/apache/inlong/common/util/BasicAuth.java | 41 ++++++++++
inlong-dataproxy/conf/common.properties | 6 +-
.../apache/inlong/dataproxy/config/AuthUtils.java | 48 ++++--------
.../inlong/dataproxy/config/ConfigManager.java | 1 +
.../dataproxy/config/RemoteConfigManager.java | 1 +
.../inlong/dataproxy/consts/ConfigConstants.java | 2 +
.../inlong/manager/common/auth/InlongShiro.java | 6 +-
.../manager/service/core/impl/UserServiceImpl.java | 4 +-
.../manager-web/sql/apache_inlong_manager.sql | 6 +-
.../inlong/manager/web/auth/ShiroConfig.java | 36 ++++-----
.../manager/web/auth/impl/InlongShiroImpl.java | 36 ++++++---
.../OpenAPIAuthenticatingRealm.java} | 53 ++++++-------
.../OpenAPIFilter.java} | 90 ++++++++++++----------
.../manager/web/auth/openapi/SecretToken.java | 43 +++++++++++
.../web/auth/{ => web}/AuthenticationFilter.java | 23 +++---
.../web/auth/{ => web}/WebAuthorizingRealm.java | 2 +-
.../inlong/sdk/dataproxy/ConfigConstants.java | 2 +-
.../inlong/sdk/dataproxy/ProxyClientConfig.java | 9 ++-
.../sdk/dataproxy/config/ProxyConfigManager.java | 15 +---
.../sdk/dataproxy/example/HttpClientExample.java | 9 ++-
.../sdk/dataproxy/example/TcpClientExample.java | 4 +-
.../sdk/dataproxy/utils/ServiceDiscoveryUtils.java | 7 +-
28 files changed, 290 insertions(+), 181 deletions(-)
diff --git
a/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/constant/FetcherConstants.java
b/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/constant/FetcherConstants.java
index 95da1bf02..3554ee6ac 100644
---
a/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/constant/FetcherConstants.java
+++
b/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/constant/FetcherConstants.java
@@ -64,4 +64,6 @@ public class FetcherConstants {
public static final String VERSION = "1.0";
+ public static final String AGENT_MANAGER_AUTH_SECRET_ID =
"agent.manager.auth.secretId";
+ public static final String AGENT_MANAGER_AUTH_SECRET_KEY =
"agent.manager.auth.secretKey";
}
diff --git
a/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/utils/HttpManager.java
b/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/utils/HttpManager.java
index d11c509cc..255dfa9e1 100644
---
a/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/utils/HttpManager.java
+++
b/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/utils/HttpManager.java
@@ -28,6 +28,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.inlong.agent.conf.AgentConfiguration;
+import org.apache.inlong.common.util.BasicAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,6 +36,8 @@ import java.util.concurrent.TimeUnit;
import static
org.apache.inlong.agent.constant.FetcherConstants.AGENT_HTTP_APPLICATION_JSON;
import static
org.apache.inlong.agent.constant.FetcherConstants.AGENT_HTTP_SUCCESS_CODE;
+import static
org.apache.inlong.agent.constant.FetcherConstants.AGENT_MANAGER_AUTH_SECRET_ID;
+import static
org.apache.inlong.agent.constant.FetcherConstants.AGENT_MANAGER_AUTH_SECRET_KEY;
import static
org.apache.inlong.agent.constant.FetcherConstants.AGENT_MANAGER_REQUEST_TIMEOUT;
import static
org.apache.inlong.agent.constant.FetcherConstants.DEFAULT_AGENT_MANAGER_REQUEST_TIMEOUT;
@@ -52,10 +55,14 @@ public class HttpManager {
}
private final CloseableHttpClient httpClient;
+ private final String secretId;
+ private final String secretKey;
public HttpManager(AgentConfiguration conf) {
httpClient =
constructHttpClient(conf.getInt(AGENT_MANAGER_REQUEST_TIMEOUT,
DEFAULT_AGENT_MANAGER_REQUEST_TIMEOUT));
+ secretId = conf.get(AGENT_MANAGER_AUTH_SECRET_ID);
+ secretKey = conf.get(AGENT_MANAGER_AUTH_SECRET_KEY);
}
/**
@@ -86,6 +93,7 @@ public class HttpManager {
public String doSentPost(String url, Object dto) {
try {
HttpPost post = getHttpPost(url);
+ post.addHeader(BasicAuth.BASIC_AUTH_HEADER,
BasicAuth.genBasicAuthCredential(secretId, secretKey));
StringEntity stringEntity = new StringEntity(toJsonStr(dto));
stringEntity.setContentType(AGENT_HTTP_APPLICATION_JSON);
post.setEntity(stringEntity);
@@ -117,6 +125,7 @@ public class HttpManager {
public String doSendGet(String url) {
try {
HttpGet get = getHttpGet(url);
+ get.addHeader(BasicAuth.BASIC_AUTH_HEADER,
BasicAuth.genBasicAuthCredential(secretId, secretKey));
CloseableHttpResponse response = httpClient.execute(get);
String returnStr = EntityUtils.toString(response.getEntity());
if (returnStr != null && !returnStr.isEmpty()
diff --git a/inlong-agent/agent-core/src/test/resources/agent.properties
b/inlong-agent/agent-core/src/test/resources/agent.properties
index 156192875..ab67189a6 100755
--- a/inlong-agent/agent-core/src/test/resources/agent.properties
+++ b/inlong-agent/agent-core/src/test/resources/agent.properties
@@ -26,3 +26,5 @@ job.thread.running.core=10
############################
agent.manager.vip.http.host=127.0.0.1
agent.manager.vip.http.port=8083
+agent.manager.auth.secretId=test
+agent.manager.auth.secretKey=123456
diff --git
a/inlong-agent/agent-plugins/src/main/java/org/apache/inlong/agent/plugin/sinks/SenderManager.java
b/inlong-agent/agent-plugins/src/main/java/org/apache/inlong/agent/plugin/sinks/SenderManager.java
index 86ab06bb8..52c1ce948 100755
---
a/inlong-agent/agent-plugins/src/main/java/org/apache/inlong/agent/plugin/sinks/SenderManager.java
+++
b/inlong-agent/agent-plugins/src/main/java/org/apache/inlong/agent/plugin/sinks/SenderManager.java
@@ -41,6 +41,8 @@ import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
+import static
org.apache.inlong.agent.constant.FetcherConstants.AGENT_MANAGER_AUTH_SECRET_ID;
+import static
org.apache.inlong.agent.constant.FetcherConstants.AGENT_MANAGER_AUTH_SECRET_KEY;
import static
org.apache.inlong.agent.constant.FetcherConstants.AGENT_MANAGER_VIP_HTTP_HOST;
import static
org.apache.inlong.agent.constant.FetcherConstants.AGENT_MANAGER_VIP_HTTP_PORT;
@@ -82,6 +84,8 @@ public class SenderManager {
private int ioThreadNum;
private boolean enableBusyWait;
private Semaphore semaphore;
+ private String authSecretId;
+ private String authSecretKey;
public SenderManager(JobProfile jobConf, String inlongGroupId, String
sourcePath) {
AgentConfiguration conf = AgentConfiguration.getAgentConf();
@@ -117,6 +121,8 @@ public class SenderManager {
CommonConstants.DEFAULT_PROXY_CLIENT_IO_THREAD_NUM);
enableBusyWait =
jobConf.getBoolean(CommonConstants.PROXY_CLIENT_ENABLE_BUSY_WAIT,
CommonConstants.DEFAULT_PROXY_CLIENT_ENABLE_BUSY_WAIT);
+ authSecretId = conf.get(AGENT_MANAGER_AUTH_SECRET_ID);
+ authSecretKey = conf.get(AGENT_MANAGER_AUTH_SECRET_KEY);
this.sourcePath = sourcePath;
this.inlongGroupId = inlongGroupId;
@@ -151,7 +157,7 @@ public class SenderManager {
private DefaultMessageSender createMessageSender(String tagName) throws
Exception {
ProxyClientConfig proxyClientConfig = new ProxyClientConfig(
- localhost, isLocalVisit, managerHost, managerPort, tagName,
netTag);
+ localhost, isLocalVisit, managerHost, managerPort, tagName,
netTag, authSecretId, authSecretKey);
proxyClientConfig.setTotalAsyncCallbackSize(totalAsyncBufSize);
proxyClientConfig.setFile(isFile);
proxyClientConfig.setAliveConnections(aliveConnectionNum);
diff --git a/inlong-agent/agent-plugins/src/test/resources/agent.properties
b/inlong-agent/agent-plugins/src/test/resources/agent.properties
index daf48afc9..9bdbc18b5 100755
--- a/inlong-agent/agent-plugins/src/test/resources/agent.properties
+++ b/inlong-agent/agent-plugins/src/test/resources/agent.properties
@@ -22,4 +22,6 @@ agent.conf.resource=manager
job.thread.running.core=10
agent.manager.vip.http.host=127.0.0.1
agent.manager.vip.http.port=8083
-agent.fetcher.classname=org.apache.inlong.agent.plugin.fetcher.ManagerFetcher
\ No newline at end of file
+agent.fetcher.classname=org.apache.inlong.agent.plugin.fetcher.ManagerFetcher
+agent.manager.auth.secretId=test
+agent.manager.auth.secretKey=123456
\ No newline at end of file
diff --git a/inlong-agent/conf/agent.properties
b/inlong-agent/conf/agent.properties
index 2fd76acf2..519835c94 100755
--- a/inlong-agent/conf/agent.properties
+++ b/inlong-agent/conf/agent.properties
@@ -106,6 +106,8 @@ agent.scheduled.snapshotreport=0 0/1 * * * ? *
############################
agent.manager.vip.http.host=127.0.0.1
agent.manager.vip.http.port=8083
+agent.manager.auth.secretId=admin
+agent.manager.auth.secretKey=87haw3VYTPqK5fK0
diff --git
a/inlong-common/src/main/java/org/apache/inlong/common/util/BasicAuth.java
b/inlong-common/src/main/java/org/apache/inlong/common/util/BasicAuth.java
new file mode 100644
index 000000000..74e022020
--- /dev/null
+++ b/inlong-common/src/main/java/org/apache/inlong/common/util/BasicAuth.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.inlong.common.util;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+/**
+ * Basic authentication utility
+ */
+public class BasicAuth {
+
+ public static final String BASIC_AUTH_HEADER = "Authorization";
+ public static final String BASIC_AUTH_PREFIX = "Basic";
+ public static final String BASIC_AUTH_SEPARATOR = " ";
+ public static final String BASIC_AUTH_JOINER = ":";
+
+ /**
+ * Generate http basic auth credential from configured secretId and
secretKey
+ */
+ public static String genBasicAuthCredential(String secretId, String
secretKey) {
+ String credential = String.join(BASIC_AUTH_JOINER, secretId,
secretKey);
+ return BASIC_AUTH_PREFIX + BASIC_AUTH_SEPARATOR + Base64.getEncoder()
+ .encodeToString(credential.getBytes(StandardCharsets.UTF_8));
+ }
+}
diff --git a/inlong-dataproxy/conf/common.properties
b/inlong-dataproxy/conf/common.properties
index a6f042ae2..4639c54e0 100644
--- a/inlong-dataproxy/conf/common.properties
+++ b/inlong-dataproxy/conf/common.properties
@@ -18,8 +18,10 @@
#
# cluter id is for future use please write 1
cluster.id=1
-# manager open api address
+# manager open api address and auth key
manager.hosts=127.0.0.1:8083
+manager.auth.secretId=admin
+manager.auth.secretKey=87haw3VYTPqK5fK0
# proxy cluster name
proxy.cluster.name=default_dataproxy
# check interval of local config (millisecond)
@@ -37,4 +39,4 @@ audit.proxys=127.0.0.1:10081
# report config log
report.config.log.enable=true
report.config.log.server.url=http://127.0.0.1:8083/api/inlong/manager/openapi/stream/log/reportConfigLogStatus
-report.config.log.interval=60000
\ No newline at end of file
+report.config.log.interval=60000
diff --git
a/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/AuthUtils.java
b/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/AuthUtils.java
index aa0a1beaa..0008f1a04 100644
---
a/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/AuthUtils.java
+++
b/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/AuthUtils.java
@@ -17,46 +17,30 @@
package org.apache.inlong.dataproxy.config;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-import java.security.SecureRandom;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.codec.binary.StringUtils;
-import org.apache.commons.codec.digest.HmacUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.inlong.common.util.BasicAuth;
+import org.apache.inlong.dataproxy.consts.ConfigConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Map;
+
public class AuthUtils {
private static final Logger LOG = LoggerFactory.getLogger(AuthUtils.class);
- public static String genAuthToken(final String userName, final String
usrPassWord) {
- long timestamp = System.currentTimeMillis();
- int nonce =
- new
SecureRandom(StringUtils.getBytesUtf8(String.valueOf(timestamp)))
- .nextInt(Integer.MAX_VALUE);
- String signature = getAuthSignature(userName, usrPassWord, timestamp,
nonce);
- return "manager" + " " + userName + " " + timestamp + " " + nonce + "
" + signature;
- }
-
- private static String getAuthSignature(final String usrName,
- final String usrPassWord,
- long timestamp, int randomValue) {
- Base64 base64 = new Base64();
- StringBuilder sbuf = new StringBuilder(512);
- byte[] baseStr =
- base64.encode(HmacUtils.hmacSha1(usrPassWord,
-
sbuf.append(usrName).append(timestamp).append(randomValue).toString()));
- sbuf.delete(0, sbuf.length());
- String signature = "";
- try {
- signature = URLEncoder.encode(new String(baseStr,
StandardCharsets.UTF_8), "UTF-8");
- } catch (UnsupportedEncodingException e) {
- LOG.error("exception caught", e);
+ /**
+ * Generate http basic auth credential from configured secretId and
secretKey
+ */
+ public static String genBasicAuth() {
+ Map<String, String> properties =
ConfigManager.getInstance().getCommonProperties();
+ String secretId =
properties.get(ConfigConstants.MANAGER_AUTH_SECRET_ID);
+ String secretKey =
properties.get(ConfigConstants.MANAGER_AUTH_SECRET_KEY);
+ if (StringUtils.isBlank(secretId) || StringUtils.isBlank(secretKey)) {
+ LOG.error("secretId or secretKey missing");
+ return null;
}
- return signature;
+ return BasicAuth.genBasicAuthCredential(secretId, secretKey);
}
}
diff --git
a/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/ConfigManager.java
b/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/ConfigManager.java
index b269c1711..db1bdb12f 100644
---
a/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/ConfigManager.java
+++
b/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/ConfigManager.java
@@ -276,6 +276,7 @@ public class ConfigManager {
LOG.info("start to request {} to get config info", url);
httpGet = new HttpGet(url);
httpGet.addHeader(HttpHeaders.CONNECTION, "close");
+ httpGet.addHeader(HttpHeaders.AUTHORIZATION,
AuthUtils.genBasicAuth());
// request with post
CloseableHttpResponse response = httpClient.execute(httpGet);
diff --git
a/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/RemoteConfigManager.java
b/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/RemoteConfigManager.java
index 5997eb543..df5ed5f8c 100644
---
a/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/RemoteConfigManager.java
+++
b/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/config/RemoteConfigManager.java
@@ -192,6 +192,7 @@ public class RemoteConfigManager implements IRepository {
LOGGER.info("start to request {} to get config info", url);
httpGet = new HttpGet(url);
httpGet.addHeader(HttpHeaders.CONNECTION, "close");
+ httpGet.addHeader(HttpHeaders.AUTHORIZATION,
AuthUtils.genBasicAuth());
// request with get
CloseableHttpResponse response = httpClient.execute(httpGet);
diff --git
a/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/consts/ConfigConstants.java
b/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/consts/ConfigConstants.java
index 3e86620eb..27cb78eee 100644
---
a/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/consts/ConfigConstants.java
+++
b/inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/consts/ConfigConstants.java
@@ -122,4 +122,6 @@ public class ConfigConstants {
public static final String MANAGER_GET_CONFIG_PATH =
"/dataproxy/getConfig";
public static final String MANAGER_GET_ALL_CONFIG_PATH =
"/dataproxy/getAllConfig";
+ public static final String MANAGER_AUTH_SECRET_ID =
"manager.auth.secretId";
+ public static final String MANAGER_AUTH_SECRET_KEY =
"manager.auth.secretKey";
}
diff --git
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/auth/InlongShiro.java
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/auth/InlongShiro.java
index b6fb3e58c..d2f2af67c 100644
---
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/auth/InlongShiro.java
+++
b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/auth/InlongShiro.java
@@ -19,17 +19,19 @@ package org.apache.inlong.manager.common.auth;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
-import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.realm.Realm;
import
org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.WebSecurityManager;
import org.apache.shiro.web.session.mgt.WebSessionManager;
+import java.util.Collection;
+
public interface InlongShiro {
WebSecurityManager getWebSecurityManager();
- AuthorizingRealm getShiroRealm();
+ Collection<Realm> getShiroRealms();
WebSessionManager getWebSessionManager();
diff --git
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/UserServiceImpl.java
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/UserServiceImpl.java
index 9689ee077..80a0526ca 100644
---
a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/UserServiceImpl.java
+++
b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/UserServiceImpl.java
@@ -60,6 +60,8 @@ public class UserServiceImpl implements UserService {
private static final Logger LOGGER =
LoggerFactory.getLogger(UserServiceImpl.class);
+ private static final Integer SECRET_KEY_SIZE = 16;
+
@Autowired
private UserEntityMapper userMapper;
@@ -126,7 +128,7 @@ public class UserServiceImpl implements UserService {
Map<String, String> keyPairs = RSAUtils.generateRSAKeyPairs();
String publicKey = keyPairs.get(RSAUtils.PUBLIC_KEY);
String privateKey = keyPairs.get(RSAUtils.PRIVATE_KEY);
- String secretKey = RandomStringUtils.randomAlphanumeric(8);
+ String secretKey =
RandomStringUtils.randomAlphanumeric(SECRET_KEY_SIZE);
Integer encryptVersion = AESUtils.getCurrentVersion(null);
entity.setEncryptVersion(encryptVersion);
entity.setPublicKey(AESUtils.encryptToString(publicKey.getBytes(StandardCharsets.UTF_8),
encryptVersion));
diff --git a/inlong-manager/manager-web/sql/apache_inlong_manager.sql
b/inlong-manager/manager-web/sql/apache_inlong_manager.sql
index 9cb3f3653..dcc8d393d 100644
--- a/inlong-manager/manager-web/sql/apache_inlong_manager.sql
+++ b/inlong-manager/manager-web/sql/apache_inlong_manager.sql
@@ -598,9 +598,9 @@ CREATE TABLE IF NOT EXISTS `user`
DEFAULT CHARSET = utf8mb4 COMMENT ='User table';
-- create default admin user, username is 'admin', password is 'inlong'
-INSERT INTO `user` (name, password, account_type, due_date, create_time,
update_time, create_by, update_by)
-VALUES ('admin', '628ed559bff5ae36bd2184d4216973cf', 0, '2099-12-31 23:59:59',
- CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'inlong_init', 'inlong_init');
+INSERT INTO `user` (name, password, secret_key, account_type, due_date,
create_time, update_time, create_by, update_by, encrypt_version)
+VALUES ('admin', '628ed559bff5ae36bd2184d4216973cf',
'9B5DCE950F284141D5493A2DAFEBD1BFEECE075FC5F426E8B67F33F14876E2D0', 0,
'2099-12-31 23:59:59',
+ CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'inlong_init', 'inlong_init', 1);
-- ----------------------------
-- Table structure for user_role
diff --git
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/ShiroConfig.java
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/ShiroConfig.java
index 5c327e362..cd808489a 100644
---
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/ShiroConfig.java
+++
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/ShiroConfig.java
@@ -17,20 +17,20 @@
package org.apache.inlong.manager.web.auth;
-import javax.annotation.Resource;
import org.apache.inlong.manager.common.auth.InlongShiro;
-import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
-import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.realm.Realm;
import
org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.mgt.WebSecurityManager;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
-import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import javax.annotation.Resource;
+import java.util.Collection;
+
/**
* Inlong hiro config.
*/
@@ -38,43 +38,33 @@ import org.springframework.context.annotation.Configuration;
public class ShiroConfig {
@Resource
- private InlongShiro inLongShiro;
+ private InlongShiro inlongShiro;
@Bean
- public AuthorizingRealm shiroRealm(HashedCredentialsMatcher matcher) {
- AuthorizingRealm authorizingRealm = inLongShiro.getShiroRealm();
- authorizingRealm.setCredentialsMatcher(matcher);
- return authorizingRealm;
+ public Collection<Realm> shiroRealms() {
+ return inlongShiro.getShiroRealms();
}
@Bean
- public WebSecurityManager
securityManager(@Qualifier("hashedCredentialsMatcher")
- HashedCredentialsMatcher matcher) {
- DefaultWebSecurityManager securityManager =
(DefaultWebSecurityManager) inLongShiro.getWebSecurityManager();
- securityManager.setRealm(shiroRealm(matcher));
+ public WebSecurityManager securityManager() {
+ DefaultWebSecurityManager securityManager =
(DefaultWebSecurityManager) inlongShiro.getWebSecurityManager();
+ securityManager.setRealms(shiroRealms());
return securityManager;
}
@Bean
public DefaultWebSessionManager sessionManager() {
- DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)
inLongShiro.getWebSessionManager();
+ DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)
inlongShiro.getWebSessionManager();
sessionManager.setGlobalSessionTimeout(1000 * 60 * 60);
return sessionManager;
}
- @Bean(name = "hashedCredentialsMatcher")
- public HashedCredentialsMatcher hashedCredentialsMatcher() {
- HashedCredentialsMatcher hashedCredentialsMatcher =
(HashedCredentialsMatcher) inLongShiro
- .getCredentialsMatcher();
- return hashedCredentialsMatcher;
- }
-
/**
* Filter for annon / authc
*/
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager)
{
- ShiroFilterFactoryBean shiroFilterFactoryBean =
inLongShiro.getShiroFilter(securityManager);
+ ShiroFilterFactoryBean shiroFilterFactoryBean =
inlongShiro.getShiroFilter(securityManager);
return shiroFilterFactoryBean;
}
@@ -83,6 +73,6 @@ public class ShiroConfig {
*/
@Bean
public AuthorizationAttributeSourceAdvisor
authorizationAttributeSourceAdvisor() {
- return
inLongShiro.getAuthorizationAttributeSourceAdvisor(securityManager(hashedCredentialsMatcher()));
+ return
inlongShiro.getAuthorizationAttributeSourceAdvisor(securityManager());
}
}
diff --git
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/impl/InlongShiroImpl.java
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/impl/InlongShiroImpl.java
index a10953149..fee83cd92 100644
---
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/impl/InlongShiroImpl.java
+++
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/impl/InlongShiroImpl.java
@@ -17,17 +17,17 @@
package org.apache.inlong.manager.web.auth.impl;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import javax.servlet.Filter;
import org.apache.inlong.manager.common.auth.InlongShiro;
import org.apache.inlong.manager.service.core.UserService;
-import org.apache.inlong.manager.web.auth.AuthenticationFilter;
-import org.apache.inlong.manager.web.auth.WebAuthorizingRealm;
+import org.apache.inlong.manager.web.auth.openapi.OpenAPIAuthenticatingRealm;
+import org.apache.inlong.manager.web.auth.openapi.OpenAPIFilter;
+import org.apache.inlong.manager.web.auth.web.AuthenticationFilter;
+import org.apache.inlong.manager.web.auth.web.WebAuthorizingRealm;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.realm.Realm;
import
org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
@@ -38,6 +38,13 @@ import
org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
+import javax.servlet.Filter;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
/**
* Inlong shiro service layer implementation.
*/
@@ -45,6 +52,9 @@ import org.springframework.stereotype.Component;
@Component
public class InlongShiroImpl implements InlongShiro {
+ private static final String FILTER_NAME_WEB = "authWeb";
+ private static final String FILTER_NAME_API = "authAPI";
+
@Autowired
private UserService userService;
@@ -54,8 +64,12 @@ public class InlongShiroImpl implements InlongShiro {
}
@Override
- public AuthorizingRealm getShiroRealm() {
- return new WebAuthorizingRealm(userService);
+ public Collection<Realm> getShiroRealms() {
+ AuthorizingRealm webRealm = new WebAuthorizingRealm(userService);
+ webRealm.setCredentialsMatcher(getCredentialsMatcher());
+ Realm apiRealm = new OpenAPIAuthenticatingRealm(userService);
+ List<Realm> realms = Arrays.asList(webRealm, apiRealm);
+ return realms;
}
@Override
@@ -77,7 +91,8 @@ public class InlongShiroImpl implements InlongShiro {
shiroFilterFactoryBean.setSecurityManager(securityManager);
// anon: can be accessed by anyone, authc: only authentication is
successful can be accessed
Map<String, Filter> filters = new LinkedHashMap<>();
- filters.put("authc", new AuthenticationFilter());
+ filters.put(FILTER_NAME_WEB, new AuthenticationFilter());
+ filters.put(FILTER_NAME_API, new OpenAPIFilter());
shiroFilterFactoryBean.setFilters(filters);
Map<String, String> pathDefinitions = new LinkedHashMap<>();
// login, register request
@@ -91,9 +106,10 @@ public class InlongShiroImpl implements InlongShiro {
pathDefinitions.put("/swagger-resources", "anon");
// openapi
- pathDefinitions.put("/openapi/**/*", "anon");
+ pathDefinitions.put("/openapi/**/*", FILTER_NAME_API);
- pathDefinitions.put("/**", "authc");
+ // other web
+ pathDefinitions.put("/**", FILTER_NAME_WEB);
shiroFilterFactoryBean.setFilterChainDefinitionMap(pathDefinitions);
return shiroFilterFactoryBean;
diff --git
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/WebAuthorizingRealm.java
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIAuthenticatingRealm.java
similarity index 52%
copy from
inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/WebAuthorizingRealm.java
copy to
inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIAuthenticatingRealm.java
index abc9fa9a5..834d2bec1 100644
---
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/WebAuthorizingRealm.java
+++
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIAuthenticatingRealm.java
@@ -15,11 +15,10 @@
* limitations under the License.
*/
-package org.apache.inlong.manager.web.auth;
+package org.apache.inlong.manager.web.auth.openapi;
-import com.google.common.collect.Sets;
-import org.apache.inlong.manager.common.enums.UserTypeEnum;
-import org.apache.inlong.manager.common.pojo.user.UserDetail;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.inlong.manager.common.util.AESUtils;
import org.apache.inlong.manager.common.util.Preconditions;
import org.apache.inlong.manager.dao.entity.UserEntity;
import org.apache.inlong.manager.service.core.UserService;
@@ -27,53 +26,45 @@ import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
-import org.apache.shiro.authc.UsernamePasswordToken;
-import org.apache.shiro.authz.AuthorizationInfo;
-import org.apache.shiro.authz.SimpleAuthorizationInfo;
-import org.apache.shiro.realm.AuthorizingRealm;
-import org.apache.shiro.subject.PrincipalCollection;
+import org.apache.shiro.realm.AuthenticatingRealm;
import java.util.Date;
/**
- * Web user authorization.
+ * Open api client authorization.
*/
-public class WebAuthorizingRealm extends AuthorizingRealm {
+@Slf4j
+public class OpenAPIAuthenticatingRealm extends AuthenticatingRealm {
private final UserService userService;
- public WebAuthorizingRealm(UserService userService) {
+ public OpenAPIAuthenticatingRealm(UserService userService) {
this.userService = userService;
}
/**
- * Login authentication
+ * Get open api authentication info
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken
authenticationToken)
throws AuthenticationException {
- UsernamePasswordToken upToken = (UsernamePasswordToken)
authenticationToken;
- String username = upToken.getUsername();
+ SecretToken upToken = (SecretToken) authenticationToken;
+ String username = upToken.getSecretId();
UserEntity userEntity = userService.getByUsername(username);
Preconditions.checkNotNull(userEntity, "User doesn't exist");
Preconditions.checkTrue(userEntity.getDueDate().after(new Date()),
"user has expired");
- UserDetail userDetail = new UserDetail();
- userDetail.setUsername(username);
- userDetail.setRoles(Sets.newHashSet(userEntity.getAccountType() == 0
- ? UserTypeEnum.ADMIN.name() : UserTypeEnum.OPERATOR.name()));
- return new SimpleAuthenticationInfo(userDetail,
userEntity.getPassword(), getName());
+ try {
+ String secretKey = new String(
+ AESUtils.decryptAsString(userEntity.getSecretKey(),
userEntity.getEncryptVersion()));
+ return new SimpleAuthenticationInfo(username, secretKey,
getName());
+ } catch (Exception e) {
+ log.error("decrypt secret key fail: ", e);
+ throw new AuthenticationException("internal error: " +
e.getMessage());
+ }
}
- /**
- * URI access control
- */
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection
principalCollection) {
- SimpleAuthorizationInfo simpleAuthorizationInfo = new
SimpleAuthorizationInfo();
- UserDetail userDetail = (UserDetail)
getAvailablePrincipal(principalCollection);
- if (userDetail != null) {
- simpleAuthorizationInfo.setRoles(userDetail.getRoles());
- }
- return simpleAuthorizationInfo;
+ public boolean supports(AuthenticationToken token) {
+ return token instanceof SecretToken;
}
+
}
diff --git
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/AuthenticationFilter.java
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIFilter.java
similarity index 58%
copy from
inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/AuthenticationFilter.java
copy to
inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIFilter.java
index 4eb751aed..d7f525e7a 100644
---
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/AuthenticationFilter.java
+++
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIFilter.java
@@ -15,9 +15,17 @@
* limitations under the License.
*/
-package org.apache.inlong.manager.web.auth;
+package org.apache.inlong.manager.web.auth.openapi;
+
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.apache.inlong.common.util.BasicAuth;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
@@ -26,47 +34,32 @@ import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.inlong.manager.common.pojo.user.UserDetail;
-import org.apache.inlong.manager.common.util.LoginUserUtils;
-import org.apache.inlong.manager.common.util.Preconditions;
-import org.apache.shiro.SecurityUtils;
-import org.apache.shiro.authc.UsernamePasswordToken;
-import org.apache.shiro.subject.Subject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.IOException;
+import java.util.Base64;
/**
- * Filter of authentication.
+ * Filter of open api authentication.
*/
@Slf4j
-public class AuthenticationFilter implements Filter {
+public class OpenAPIFilter implements Filter {
- public static final String USERNAME = "username";
- public static final String PASSWORD = "password";
- private static final Logger LOGGER =
LoggerFactory.getLogger(AuthenticationFilter.class);
+ private static final Logger LOGGER =
LoggerFactory.getLogger(OpenAPIFilter.class);
- public AuthenticationFilter() {
+ public OpenAPIFilter() {
}
@Override
public void init(FilterConfig filterConfig) {
}
+ @SneakyThrows
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)
servletRequest;
-
Subject subject = SecurityUtils.getSubject();
- if (subject.isAuthenticated()) {
- UserDetail loginUserDetail = (UserDetail) subject.getPrincipal();
- doFilter(servletRequest, servletResponse, filterChain,
loginUserDetail);
- return;
- }
-
try {
- UsernamePasswordToken token = getPasswordToken(servletRequest);
+ SecretToken token = parseBasicAuth(httpServletRequest);
subject.login(token);
} catch (Exception ex) {
LOGGER.error("login error, msg: {}", ex.getMessage());
@@ -80,25 +73,42 @@ public class AuthenticationFilter implements Filter {
((HttpServletResponse)
servletResponse).sendError(HttpServletResponse.SC_FORBIDDEN);
return;
}
- doFilter(servletRequest, servletResponse, filterChain, (UserDetail)
subject.getPrincipal());
+ filterChain.doFilter(servletRequest, servletResponse);
}
- private void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain filterChain,
- UserDetail userDetail) throws IOException, ServletException {
- LoginUserUtils.setUserLoginInfo(userDetail);
- try {
- filterChain.doFilter(servletRequest, servletResponse);
- } finally {
- LoginUserUtils.removeUserLoginInfo();
+ private SecretToken parseBasicAuth(HttpServletRequest servletRequest)
throws Exception {
+ String basicAuth =
servletRequest.getHeader(BasicAuth.BASIC_AUTH_HEADER);
+ if (StringUtils.isBlank(basicAuth)) {
+ log.error("basic auth is empty");
+ return null;
+ }
+
+ // Basic auth string must be "Basic Base64(ID:Secret)"
+ String[] parts = basicAuth.split(BasicAuth.BASIC_AUTH_SEPARATOR);
+ if (parts.length != 2) {
+ log.error("parts size error: {}", parts);
+ return null;
+ }
+ if (!parts[0].equals(BasicAuth.BASIC_AUTH_PREFIX)) {
+ log.error("prefix error: {}", parts[0]);
+ return null;
+ }
+
+ String joinedPair = new String(Base64.getDecoder().decode(parts[1]));
+ String[] pair = joinedPair.split(BasicAuth.BASIC_AUTH_JOINER);
+ if (pair.length != 2) {
+ log.error("pair format error: {}", pair);
+ return null;
+ }
+
+ String secretId = pair[0];
+ String secretKey = pair[1];
+ if (StringUtils.isBlank(secretId) || StringUtils.isBlank(secretKey)) {
+ log.error("invalid id = {} or key = {}", secretId, secretKey);
+ return null;
}
- }
- private UsernamePasswordToken getPasswordToken(ServletRequest
servletRequest) {
- String username = servletRequest.getParameter(USERNAME);
- String password = servletRequest.getParameter(PASSWORD);
- Preconditions.checkNotNull(username, "please input username");
- Preconditions.checkNotNull(password, "please input password");
- return new UsernamePasswordToken(username, password);
+ return new SecretToken(secretId, secretKey);
}
@Override
diff --git
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/SecretToken.java
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/SecretToken.java
new file mode 100644
index 000000000..61d511e02
--- /dev/null
+++
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/SecretToken.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.inlong.manager.web.auth.openapi;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.apache.shiro.authc.AuthenticationToken;
+
+/**
+ * Authentication token for open api client
+ */
+@Data
+@AllArgsConstructor
+public class SecretToken implements AuthenticationToken {
+
+ private String secretId;
+ private String secretKey;
+
+ @Override
+ public Object getPrincipal() {
+ return secretId;
+ }
+
+ @Override
+ public Object getCredentials() {
+ return secretKey;
+ }
+}
diff --git
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/AuthenticationFilter.java
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/web/AuthenticationFilter.java
similarity index 97%
rename from
inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/AuthenticationFilter.java
rename to
inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/web/AuthenticationFilter.java
index 4eb751aed..229f0648b 100644
---
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/AuthenticationFilter.java
+++
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/web/AuthenticationFilter.java
@@ -15,17 +15,8 @@
* limitations under the License.
*/
-package org.apache.inlong.manager.web.auth;
+package org.apache.inlong.manager.web.auth.web;
-import java.io.IOException;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.inlong.manager.common.pojo.user.UserDetail;
import org.apache.inlong.manager.common.util.LoginUserUtils;
@@ -36,8 +27,18 @@ import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
/**
- * Filter of authentication.
+ * Filter of web user authentication.
*/
@Slf4j
public class AuthenticationFilter implements Filter {
diff --git
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/WebAuthorizingRealm.java
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/web/WebAuthorizingRealm.java
similarity index 98%
rename from
inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/WebAuthorizingRealm.java
rename to
inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/web/WebAuthorizingRealm.java
index abc9fa9a5..098cf0bf0 100644
---
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/WebAuthorizingRealm.java
+++
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/web/WebAuthorizingRealm.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.inlong.manager.web.auth;
+package org.apache.inlong.manager.web.auth.web;
import com.google.common.collect.Sets;
import org.apache.inlong.manager.common.enums.UserTypeEnum;
diff --git
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/ConfigConstants.java
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/ConfigConstants.java
index 988b50429..c6853b820 100644
---
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/ConfigConstants.java
+++
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/ConfigConstants.java
@@ -21,6 +21,7 @@ package org.apache.inlong.sdk.dataproxy;
import java.util.concurrent.TimeUnit;
public class ConfigConstants {
+
public static final String PROXY_SDK_VERSION = "1.2.11";
public static final int ALIVE_CONNECTIONS = 3;
@@ -62,7 +63,6 @@ public class ConfigConstants {
public static final String RECEIVE_BUFFER_SIZE = "receiveBufferSize";
public static final String SEND_BUFFER_SIZE = "sendBufferSize";
- public static final String REQUEST_HEADER_AUTHORIZATION = "Authorization";
public static final int FLAG_ALLOW_AUTH = 1 << 7;
public static final int FLAG_ALLOW_ENCRYPT = 1 << 6;
public static final int FLAG_ALLOW_COMPRESS = 1 << 5;
diff --git
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/ProxyClientConfig.java
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/ProxyClientConfig.java
index d68eba7f8..30bedcdb7 100644
---
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/ProxyClientConfig.java
+++
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/ProxyClientConfig.java
@@ -18,10 +18,12 @@
package org.apache.inlong.sdk.dataproxy;
+import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.apache.inlong.sdk.dataproxy.network.ProxysdkException;
import org.apache.inlong.sdk.dataproxy.network.Utils;
+@Data
public class ProxyClientConfig {
private int aliveConnections;
@@ -48,6 +50,8 @@ public class ProxyClientConfig {
private String tlsServerCertFilePathAndName;
private String tlsServerKey;
private int maxTimeoutCnt = ConfigConstants.MAX_TIMEOUT_CNT;
+ private String authSecretId;
+ private String authSecretKey;
private boolean enableSaveManagerVIps = true;
@@ -93,7 +97,8 @@ public class ProxyClientConfig {
/*pay attention to the last url parameter ip*/
public ProxyClientConfig(String localHost, boolean isLocalVisit, String
managerIp,
- int managerPort, String groupId, String netTag) throws
ProxysdkException {
+ int managerPort, String groupId, String netTag, String
authSecretId, String authSecretKey)
+ throws ProxysdkException {
if (Utils.isBlank(localHost)) {
throw new ProxysdkException("localHost is blank!");
}
@@ -119,6 +124,8 @@ public class ProxyClientConfig {
this.proxyUpdateMaxRetry = ConfigConstants.PROXY_UPDATE_MAX_RETRY;
this.connectTimeoutMillis =
ConfigConstants.DEFAULT_CONNECT_TIMEOUT_MILLIS;
this.setRequestTimeoutMillis(ConfigConstants.DEFAULT_SEND_BUFFER_SIZE);
+ this.authSecretId = authSecretId;
+ this.authSecretKey = authSecretKey;
}
public String getTlsServerCertFilePathAndName() {
diff --git
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/config/ProxyConfigManager.java
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/config/ProxyConfigManager.java
index e96bd06c0..a69b91478 100644
---
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/config/ProxyConfigManager.java
+++
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/config/ProxyConfigManager.java
@@ -45,6 +45,7 @@ import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
+import org.apache.inlong.common.util.BasicAuth;
import org.apache.inlong.common.pojo.dataproxy.DataProxyNodeInfo;
import org.apache.inlong.common.pojo.dataproxy.DataProxyNodeResponse;
import org.apache.inlong.sdk.dataproxy.ConfigConstants;
@@ -67,7 +68,6 @@ import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -77,8 +77,6 @@ import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantReadWriteLock;
-import static
org.apache.inlong.sdk.dataproxy.ConfigConstants.REQUEST_HEADER_AUTHORIZATION;
-
/**
* This thread requests dataproxy-host list from manager, including these
functions:
* 1. request dataproxy-host, support retry
@@ -729,14 +727,9 @@ public class ProxyConfigManager extends Thread {
LOGGER.info("Request url : " + url + ", localManagerIps : " +
localManagerIps);
try {
httpPost = new HttpPost(url);
- if (this.clientConfig.isNeedAuthentication()) {
- long timestamp = System.currentTimeMillis();
- int nonce = new
SecureRandom(String.valueOf(timestamp).getBytes()).nextInt(Integer.MAX_VALUE);
- httpPost.setHeader(REQUEST_HEADER_AUTHORIZATION,
- Utils.getAuthorizenInfo(clientConfig.getUserName(),
- clientConfig.getSecretKey(), timestamp,
nonce));
- }
-
+ httpPost.addHeader(BasicAuth.BASIC_AUTH_HEADER,
+
BasicAuth.genBasicAuthCredential(clientConfig.getAuthSecretId(),
+ clientConfig.getAuthSecretKey()));
StringEntity se = getEntity(params);
httpPost.setEntity(se);
HttpResponse response = httpClient.execute(httpPost);
diff --git
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/example/HttpClientExample.java
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/example/HttpClientExample.java
index d12924155..de66f3023 100644
---
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/example/HttpClientExample.java
+++
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/example/HttpClientExample.java
@@ -18,13 +18,14 @@
package org.apache.inlong.sdk.dataproxy.example;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
import org.apache.inlong.sdk.dataproxy.ProxyClientConfig;
import org.apache.inlong.sdk.dataproxy.network.HttpProxySender;
import org.apache.inlong.sdk.dataproxy.network.ProxysdkException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
public class HttpClientExample {
public static void main(String[] args) {
@@ -70,7 +71,7 @@ public class HttpClientExample {
try {
proxyConfig = new ProxyClientConfig(localIP, isLocalVisit,
inLongManagerAddr,
Integer.valueOf(inLongManagerPort),
- dataProxyGroup, netTag);
+ dataProxyGroup, netTag, "test", "123456");
proxyConfig.setGroupId(dataProxyGroup);
proxyConfig.setConfStoreBasePath(configBasePath);
proxyConfig.setReadProxyIPFromLocal(isReadProxyIPFromLocal);
diff --git
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/example/TcpClientExample.java
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/example/TcpClientExample.java
index d14a021f3..52e0637d2 100644
---
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/example/TcpClientExample.java
+++
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/example/TcpClientExample.java
@@ -82,7 +82,7 @@ public class TcpClientExample {
DefaultMessageSender messageSender = null;
try {
dataProxyConfig = new ProxyClientConfig(localIP, isLocalVisit,
inLongManagerAddr,
- Integer.valueOf(inLongManagerPort), dataProxyGroup,
netTag);
+ Integer.valueOf(inLongManagerPort), dataProxyGroup,
netTag, "test", "123456");
if (StringUtils.isNotEmpty(configBasePath)) {
dataProxyConfig.setConfStoreBasePath(configBasePath);
}
@@ -99,7 +99,7 @@ public class TcpClientExample {
String inlongStreamId, String messageBody, long dt) {
SendResult result = null;
try {
- result =
sender.sendMessage(messageBody.getBytes("utf8"),inlongGroupId, inlongStreamId,
+ result = sender.sendMessage(messageBody.getBytes("utf8"),
inlongGroupId, inlongStreamId,
0, String.valueOf(dt), 20, TimeUnit.SECONDS);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
diff --git
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/utils/ServiceDiscoveryUtils.java
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/utils/ServiceDiscoveryUtils.java
index cc8870698..6795a4e8c 100644
---
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/utils/ServiceDiscoveryUtils.java
+++
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/utils/ServiceDiscoveryUtils.java
@@ -38,6 +38,7 @@ import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
+import org.apache.inlong.common.util.BasicAuth;
import org.apache.inlong.sdk.dataproxy.ProxyClientConfig;
import org.apache.inlong.sdk.dataproxy.network.Utils;
import org.slf4j.Logger;
@@ -53,8 +54,6 @@ import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.ArrayList;
-import static
org.apache.inlong.sdk.dataproxy.ConfigConstants.REQUEST_HEADER_AUTHORIZATION;
-
/**
* Utils for service discovery
*/
@@ -184,7 +183,7 @@ public class ServiceDiscoveryUtils {
if (proxyClientConfig.isNeedAuthentication()) {
long timestamp = System.currentTimeMillis();
int nonce = new
SecureRandom(String.valueOf(timestamp).getBytes()).nextInt(Integer.MAX_VALUE);
- httpPost.setHeader(REQUEST_HEADER_AUTHORIZATION,
+ httpPost.setHeader(BasicAuth.BASIC_AUTH_HEADER,
Utils.getAuthorizenInfo(proxyClientConfig.getUserName(),
proxyClientConfig.getSecretKey(), timestamp,
nonce));
}
@@ -197,7 +196,7 @@ public class ServiceDiscoveryUtils {
JsonObject jb = jsonParser.parse(returnStr).getAsJsonObject();
if (jb == null) {
log.warn("ServiceDiscovery updated manager ip failed,
returnStr = {} jb is "
- + "null ", returnStr, jb);
+ + "null ", returnStr, jb);
return null;
}
JsonObject rd = jb.get("resultData").getAsJsonObject();