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();

Reply via email to