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 b65f3f1220 [INLONG-8389][Manager] Fix the tenant interception failure 
when authentication is disable (#8390)
b65f3f1220 is described below

commit b65f3f122055f665d047ed5652dc8b1679e7f0bc
Author: vernedeng <[email protected]>
AuthorDate: Mon Jul 3 09:46:18 2023 +0800

    [INLONG-8389][Manager] Fix the tenant interception failure when 
authentication is disable (#8390)
---
 .../org/apache/inlong/common/util/BasicAuth.java   |  1 +
 .../inlong/manager/web/auth/InlongShiroImpl.java   | 10 ++--
 .../auth/openapi/OpenAPIAuthenticatingRealm.java   | 31 +++++++++++-
 .../manager/web/auth/openapi/OpenAPIFilter.java    | 24 ++++-----
 .../manager/web/auth/openapi/SecretToken.java      |  4 +-
 .../web/auth/tenant/TenantAuthenticatingRealm.java | 57 ++++++++++++----------
 6 files changed, 80 insertions(+), 47 deletions(-)

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
index 46e5c98842..0cefbc7902 100644
--- 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
@@ -30,6 +30,7 @@ public class BasicAuth {
     public static final String BASIC_AUTH_HEADER = "authorization";
     public static final String BASIC_AUTH_TENANT_HEADER = "tenant";
 
+    public static final String DEFAULT_USER = "admin";
     public static final String DEFAULT_TENANT = "public";
     public static final String BASIC_AUTH_PREFIX = "Basic";
     public static final String BASIC_AUTH_SEPARATOR = " ";
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/InlongShiroImpl.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/InlongShiroImpl.java
index de7d2a3145..20b5b9b162 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/InlongShiroImpl.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/InlongShiroImpl.java
@@ -89,7 +89,7 @@ public class InlongShiroImpl implements InlongShiro {
     public Collection<Realm> getShiroRealms() {
         AuthorizingRealm webRealm = new WebAuthorizingRealm(userService);
         webRealm.setCredentialsMatcher(getCredentialsMatcher());
-        Realm apiRealm = new OpenAPIAuthenticatingRealm(userService);
+        Realm apiRealm = new OpenAPIAuthenticatingRealm(userService, 
openAPIAuthEnabled);
         Realm tenantRealm = new TenantAuthenticatingRealm(tenantRoleService, 
inlongRoleService,
                 userService, tenantService);
         return Arrays.asList(webRealm, apiRealm, tenantRealm);
@@ -132,12 +132,8 @@ public class InlongShiroImpl implements InlongShiro {
         pathDefinitions.put("/swagger-resources", "anon");
 
         // openapi
-        if (openAPIAuthEnabled) {
-            filters.put(FILTER_NAME_API, new OpenAPIFilter());
-            pathDefinitions.put("/openapi/**/*", 
genFiltersInOrder(FILTER_NAME_API, FILTER_NAME_TENANT));
-        } else {
-            pathDefinitions.put("/openapi/**/*", "anon");
-        }
+        filters.put(FILTER_NAME_API, new OpenAPIFilter());
+        pathDefinitions.put("/openapi/**/*", 
genFiltersInOrder(FILTER_NAME_API, FILTER_NAME_TENANT));
 
         // other web
         pathDefinitions.put("/**", genFiltersInOrder(FILTER_NAME_WEB, 
FILTER_NAME_TENANT));
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIAuthenticatingRealm.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIAuthenticatingRealm.java
index 4e65e2c2b4..5a5e2d97da 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIAuthenticatingRealm.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIAuthenticatingRealm.java
@@ -17,6 +17,8 @@
 
 package org.apache.inlong.manager.web.auth.openapi;
 
+import org.apache.inlong.common.util.BasicAuth;
+import org.apache.inlong.manager.common.enums.InlongUserTypeEnum;
 import org.apache.inlong.manager.common.enums.TenantUserTypeEnum;
 import org.apache.inlong.manager.common.util.AESUtils;
 import org.apache.inlong.manager.common.util.Preconditions;
@@ -40,9 +42,11 @@ import java.util.Date;
 public class OpenAPIAuthenticatingRealm extends AuthenticatingRealm {
 
     private final UserService userService;
+    private final boolean openAPIAuthEnabled;
 
-    public OpenAPIAuthenticatingRealm(UserService userService) {
+    public OpenAPIAuthenticatingRealm(UserService userService, boolean 
openAPIAuthEnabled) {
         this.userService = userService;
+        this.openAPIAuthEnabled = openAPIAuthEnabled;
     }
 
     /**
@@ -51,6 +55,29 @@ public class OpenAPIAuthenticatingRealm extends 
AuthenticatingRealm {
     @Override
     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken 
authenticationToken)
             throws AuthenticationException {
+        if (openAPIAuthEnabled) {
+            return doRealAuth(authenticationToken);
+        } else {
+            return doDefaultAuth(authenticationToken);
+        }
+    }
+
+    private AuthenticationInfo doDefaultAuth(AuthenticationToken 
authenticationToken) {
+        try {
+            UserInfo userInfo = userService.getByName(BasicAuth.DEFAULT_USER);
+            userInfo.setRoles(Sets.newHashSet(
+                    InlongUserTypeEnum.INLONG_ADMIN.name(),
+                    InlongUserTypeEnum.INLONG_OPERATOR.name(),
+                    TenantUserTypeEnum.TENANT_ADMIN.name(),
+                    TenantUserTypeEnum.TENANT_OPERATOR.name()));
+            return new SimpleAuthenticationInfo(userInfo, 
authenticationToken.getCredentials(), getName());
+        } catch (Exception e) {
+            log.error("got some exception when do default openapi auth", e);
+            throw new AuthenticationException("internal error: " + 
e.getMessage());
+        }
+    }
+
+    private AuthenticationInfo doRealAuth(AuthenticationToken 
authenticationToken) {
         SecretToken upToken = (SecretToken) authenticationToken;
         String username = upToken.getSecretId();
         UserInfo userInfo = userService.getByName(username);
@@ -64,7 +91,7 @@ public class OpenAPIAuthenticatingRealm extends 
AuthenticatingRealm {
                     : TenantUserTypeEnum.TENANT_OPERATOR.name()));
             return new SimpleAuthenticationInfo(userInfo, secretKey, 
getName());
         } catch (Exception e) {
-            log.error("decrypt secret key fail: ", e);
+            log.error("when do real openapi auth, decrypt secret key fail: ", 
e);
             throw new AuthenticationException("internal error: " + 
e.getMessage());
         }
     }
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIFilter.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIFilter.java
index b83957adc9..7086f3c20d 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIFilter.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/openapi/OpenAPIFilter.java
@@ -66,7 +66,7 @@ public class OpenAPIFilter implements Filter {
             SecretToken token = parseBasicAuth(httpServletRequest);
             subject.login(token);
         } catch (Exception ex) {
-            LOGGER.error("login error: {}", ex.getMessage());
+            LOGGER.error("login error", ex);
             ((HttpServletResponse) 
servletResponse).sendError(HttpServletResponse.SC_FORBIDDEN, ex.getMessage());
             return;
         }
@@ -85,36 +85,38 @@ public class OpenAPIFilter implements Filter {
         }
     }
 
+    // return empty token if parse failed. The realm will pass the request and 
use default user
+    // if the openapi auth is disable.
     private SecretToken parseBasicAuth(HttpServletRequest servletRequest) {
         String basicAuth = 
servletRequest.getHeader(BasicAuth.BASIC_AUTH_HEADER);
         if (StringUtils.isBlank(basicAuth)) {
-            log.error("basic auth header is empty");
-            return null;
+            log.warn("basic auth header is empty");
+            return new SecretToken();
         }
 
         // Basic auth string must be "Basic Base64(ID:Secret)"
         String[] parts = basicAuth.split(BasicAuth.BASIC_AUTH_SEPARATOR);
         if (parts.length != 2) {
-            log.error("the length parts size error: {}", parts.length);
-            return null;
+            log.warn("the length parts size error: {}", parts.length);
+            return new SecretToken();
         }
         if (!parts[0].equals(BasicAuth.BASIC_AUTH_PREFIX)) {
-            log.error("prefix error: {}", parts[0]);
-            return null;
+            log.warn("prefix error: {}", parts[0]);
+            return new SecretToken();
         }
 
         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.length);
-            return null;
+            log.warn("pair format error: {}", pair.length);
+            return new SecretToken();
         }
 
         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;
+            log.warn("invalid id = {} or key = {}", secretId, secretKey);
+            return new SecretToken();
         }
 
         return new SecretToken(secretId, secretKey);
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
index 61d511e02f..62624296a8 100644
--- 
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
@@ -19,6 +19,7 @@ package org.apache.inlong.manager.web.auth.openapi;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 import org.apache.shiro.authc.AuthenticationToken;
 
 /**
@@ -26,10 +27,11 @@ import org.apache.shiro.authc.AuthenticationToken;
  */
 @Data
 @AllArgsConstructor
+@NoArgsConstructor
 public class SecretToken implements AuthenticationToken {
 
     private String secretId;
-    private String secretKey;
+    private String secretKey = "defaultKey";
 
     @Override
     public Object getPrincipal() {
diff --git 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/tenant/TenantAuthenticatingRealm.java
 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/tenant/TenantAuthenticatingRealm.java
index 4cb92b66e6..6afeaaa442 100644
--- 
a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/tenant/TenantAuthenticatingRealm.java
+++ 
b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/tenant/TenantAuthenticatingRealm.java
@@ -63,36 +63,41 @@ public class TenantAuthenticatingRealm extends 
AuthenticatingRealm {
 
     @Override
     public AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken 
token) throws AuthenticationException {
-        TenantToken tenantToken = (TenantToken) token;
-        String username = tenantToken.getUsername();
-        String tenant = tenantToken.getTenant();
-
-        InlongTenantInfo tenantInfo = tenantService.getByName(tenant);
-        if (tenantInfo == null) {
-            String errMsg = String.format("tenant=[%s] not found", tenant);
-            log.error(errMsg);
-            throw new AuthenticationException(errMsg);
-        }
+        try {
+            TenantToken tenantToken = (TenantToken) token;
+            String username = tenantToken.getUsername();
+            String tenant = tenantToken.getTenant();
+
+            InlongTenantInfo tenantInfo = tenantService.getByName(tenant);
+            if (tenantInfo == null) {
+                String errMsg = String.format("tenant=[%s] not found", tenant);
+                log.error(errMsg);
+                throw new AuthenticationException(errMsg);
+            }
 
-        InlongRoleInfo inlongRoleInfo = 
inlongRoleService.getByUsername(username);
-        TenantRoleInfo tenantRoleInfo = 
tenantRoleService.getByUsernameAndTenant(username, tenant);
-        if (inlongRoleInfo == null && tenantRoleInfo == null) {
-            String errMsg = String.format("user=[%s] has no privilege for 
tenant=[%s]", username, tenant);
-            log.error(errMsg);
-            throw new AuthenticationException(errMsg);
-        }
+            InlongRoleInfo inlongRoleInfo = 
inlongRoleService.getByUsername(username);
+            TenantRoleInfo tenantRoleInfo = 
tenantRoleService.getByUsernameAndTenant(username, tenant);
+            if (inlongRoleInfo == null && tenantRoleInfo == null) {
+                String errMsg = String.format("user=[%s] has no privilege for 
tenant=[%s]", username, tenant);
+                log.error(errMsg);
+                throw new AuthenticationException(errMsg);
+            }
 
-        UserInfo userInfo = getUserInfo(username);
-        if (inlongRoleInfo != null) {
-            addRole(userInfo, inlongRoleInfo.getRoleCode());
-        }
+            UserInfo userInfo = getUserInfo(username);
+            if (inlongRoleInfo != null) {
+                addRole(userInfo, inlongRoleInfo.getRoleCode());
+            }
 
-        if (tenantRoleInfo != null) {
-            addRole(userInfo, tenantRoleInfo.getRoleCode());
-        }
+            if (tenantRoleInfo != null) {
+                addRole(userInfo, tenantRoleInfo.getRoleCode());
+            }
 
-        userInfo.setTenant(tenant);
-        return new SimpleAuthenticationInfo(userInfo, tenant, getName());
+            userInfo.setTenant(tenant);
+            return new SimpleAuthenticationInfo(userInfo, tenant, getName());
+        } catch (Throwable t) {
+            log.error("failed to do tenant authentication", t);
+            throw t;
+        }
     }
 
     @Override

Reply via email to