This is an automated email from the ASF dual-hosted git repository.

roryqi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new 519bcb0567 [#6353]  fix(authz): Fix the failure of chained plugin to 
load JDBC authz  plugin (#6372)
519bcb0567 is described below

commit 519bcb05674e0a7268f37855864bd58f8894180b
Author: roryqi <[email protected]>
AuthorDate: Sun Jan 26 17:15:44 2025 +0800

    [#6353]  fix(authz): Fix the failure of chained plugin to load JDBC authz  
plugin (#6372)
    
    ### What changes were proposed in this pull request?
    
    1. Load the JDBC driver of when the plugin is initializing
    2. Fix the failure of chained plugin to load jdbc  plugin
    
    ### Why are the changes needed?
    
    Fix: #6353
    
    ### Does this PR introduce _any_ user-facing change?
    No.
    
    ### How was this patch tested?
    Test by hand.
---
 .../chain/ChainedAuthorizationPlugin.java              | 18 ++++++------------
 authorizations/authorization-common/build.gradle.kts   |  1 +
 .../authorization/common/AuthorizationProperties.java  | 17 -----------------
 .../authorization/jdbc/JdbcAuthorizationPlugin.java    |  7 +++++++
 .../jdbc/TestJdbcAuthorizationPlugin.java              |  4 ++--
 5 files changed, 16 insertions(+), 31 deletions(-)

diff --git 
a/authorizations/authorization-chain/src/main/java/org/apache/gravitino/authorization/chain/ChainedAuthorizationPlugin.java
 
b/authorizations/authorization-chain/src/main/java/org/apache/gravitino/authorization/chain/ChainedAuthorizationPlugin.java
index 120c355db0..982ee38cd2 100644
--- 
a/authorizations/authorization-chain/src/main/java/org/apache/gravitino/authorization/chain/ChainedAuthorizationPlugin.java
+++ 
b/authorizations/authorization-chain/src/main/java/org/apache/gravitino/authorization/chain/ChainedAuthorizationPlugin.java
@@ -33,7 +33,6 @@ import org.apache.gravitino.authorization.Owner;
 import org.apache.gravitino.authorization.Role;
 import org.apache.gravitino.authorization.RoleChange;
 import org.apache.gravitino.authorization.User;
-import org.apache.gravitino.authorization.common.AuthorizationProperties;
 import 
org.apache.gravitino.authorization.common.ChainedAuthorizationProperties;
 import org.apache.gravitino.connector.authorization.AuthorizationPlugin;
 import org.apache.gravitino.connector.authorization.BaseAuthorization;
@@ -55,16 +54,6 @@ public class ChainedAuthorizationPlugin implements 
AuthorizationPlugin {
     ChainedAuthorizationProperties chainedAuthzProperties =
         new ChainedAuthorizationProperties(properties);
     chainedAuthzProperties.validate();
-    // Validate the properties for each plugin
-    chainedAuthzProperties
-        .plugins()
-        .forEach(
-            pluginName -> {
-              Map<String, String> pluginProperties =
-                  chainedAuthzProperties.fetchAuthPluginProperties(pluginName);
-              String authzProvider = 
chainedAuthzProperties.getPluginProvider(pluginName);
-              AuthorizationProperties.validate(authzProvider, 
pluginProperties);
-            });
     // Create the plugins
     chainedAuthzProperties
         .plugins()
@@ -83,8 +72,13 @@ public class ChainedAuthorizationPlugin implements 
AuthorizationPlugin {
               try {
                 BaseAuthorization<?> authorization =
                     BaseAuthorization.createAuthorization(classLoader, 
authzProvider);
+
+                // Load the authorization plugin with the class loader of the 
catalog.
+                // Because the JDBC authorization plugin may load JDBC driver 
using the class
+                // loader.
                 AuthorizationPlugin authorizationPlugin =
-                    authorization.newPlugin(metalake, catalogProvider, 
pluginConfig);
+                    classLoader.withClassLoader(
+                        cl -> authorization.newPlugin(metalake, 
catalogProvider, pluginConfig));
                 plugins.add(authorizationPlugin);
               } catch (Exception e) {
                 throw new RuntimeException(e);
diff --git a/authorizations/authorization-common/build.gradle.kts 
b/authorizations/authorization-common/build.gradle.kts
index 9bab92dac3..0dfd8d2cc2 100644
--- a/authorizations/authorization-common/build.gradle.kts
+++ b/authorizations/authorization-common/build.gradle.kts
@@ -49,6 +49,7 @@ dependencies {
   testImplementation(libs.junit.jupiter.api)
   testImplementation(libs.mockito.core)
   testImplementation(libs.testcontainers)
+  testImplementation(libs.h2db)
   testRuntimeOnly(libs.junit.jupiter.engine)
 }
 
diff --git 
a/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/AuthorizationProperties.java
 
b/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/AuthorizationProperties.java
index 3ece6353d6..85fe5c72ed 100644
--- 
a/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/AuthorizationProperties.java
+++ 
b/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/AuthorizationProperties.java
@@ -34,21 +34,4 @@ public abstract class AuthorizationProperties {
   public abstract String getPropertiesPrefix();
 
   public abstract void validate();
-
-  public static void validate(String type, Map<String, String> properties) {
-    switch (type) {
-      case "ranger":
-        RangerAuthorizationProperties rangerAuthorizationProperties =
-            new RangerAuthorizationProperties(properties);
-        rangerAuthorizationProperties.validate();
-        break;
-      case "chain":
-        ChainedAuthorizationProperties chainedAuthzProperties =
-            new ChainedAuthorizationProperties(properties);
-        chainedAuthzProperties.validate();
-        break;
-      default:
-        throw new IllegalArgumentException("Unsupported authorization 
properties type: " + type);
-    }
-  }
 }
diff --git 
a/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/jdbc/JdbcAuthorizationPlugin.java
 
b/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/jdbc/JdbcAuthorizationPlugin.java
index 2d74bd050e..4c8c3330a2 100644
--- 
a/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/jdbc/JdbcAuthorizationPlugin.java
+++ 
b/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/jdbc/JdbcAuthorizationPlugin.java
@@ -85,6 +85,13 @@ public abstract class JdbcAuthorizationPlugin implements 
AuthorizationPlugin, Jd
     dataSource.setTestOnReturn(BaseObjectPoolConfig.DEFAULT_TEST_ON_RETURN);
     dataSource.setLifo(BaseObjectPoolConfig.DEFAULT_LIFO);
     mappingProvider = new JdbcSecurableObjectMappingProvider();
+
+    try (Connection ignored = getConnection()) {
+      LOG.info("Load the JDBC driver first");
+    } catch (SQLException se) {
+      LOG.error("Jdbc authorization plugin exception: ", se);
+      throw toAuthorizationPluginException(se);
+    }
   }
 
   @Override
diff --git 
a/authorizations/authorization-common/src/test/java/org/apache/gravitino/authorization/jdbc/TestJdbcAuthorizationPlugin.java
 
b/authorizations/authorization-common/src/test/java/org/apache/gravitino/authorization/jdbc/TestJdbcAuthorizationPlugin.java
index 8d3788617c..c229b7a92f 100644
--- 
a/authorizations/authorization-common/src/test/java/org/apache/gravitino/authorization/jdbc/TestJdbcAuthorizationPlugin.java
+++ 
b/authorizations/authorization-common/src/test/java/org/apache/gravitino/authorization/jdbc/TestJdbcAuthorizationPlugin.java
@@ -52,13 +52,13 @@ public class TestJdbcAuthorizationPlugin {
   private static final Map<String, String> properties =
       ImmutableMap.of(
           JdbcAuthorizationProperties.JDBC_URL,
-          "xx",
+          "jdbc:h2:mem:test",
           JdbcAuthorizationProperties.JDBC_USERNAME,
           "xx",
           JdbcAuthorizationProperties.JDBC_PASSWORD,
           "xx",
           JdbcAuthorizationProperties.JDBC_DRIVER,
-          "xx");
+          "org.h2.Driver");
 
   private static final JdbcAuthorizationPlugin plugin =
       new JdbcAuthorizationPlugin(properties) {

Reply via email to