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

wuweijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 7a55c45  Refactor PrivilegeLoadAlgorithm and fill correct parameters 
in AuthorityRule (#9933)
7a55c45 is described below

commit 7a55c4524f264841c5f8fc1c220af854bb7aad92
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Apr 4 23:07:40 2021 +0800

    Refactor PrivilegeLoadAlgorithm and fill correct parameters in 
AuthorityRule (#9933)
    
    * Refactor PrivilegeBuilder
    
    * Add database type for PrivilegeBuilder
    
    * Refactor PrivilegeLoadAlgorithm and fill correct parameters in 
AuthorityRule
---
 .../authority/spi/PrivilegeLoadAlgorithm.java      | 11 +++--
 .../authority/rule/AuthorityRule.java              | 13 +++---
 .../rule/builder/AuthorityRuleBuilder.java         |  2 +-
 .../auth/GovernanceAuthenticationContext.java      |  6 ++-
 .../metadata/auth/builder/PrivilegeBuilder.java    | 53 +++++++++++++++-------
 .../context/metadata/MetaDataContextsBuilder.java  |  3 +-
 6 files changed, 56 insertions(+), 32 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java
 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java
index b3784ea..5e2e296 100644
--- 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java
@@ -18,10 +18,11 @@
 package org.apache.shardingsphere.authority.spi;
 
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithm;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.auth.model.privilege.ShardingSpherePrivilege;
 import 
org.apache.shardingsphere.infra.metadata.auth.model.user.ShardingSphereUser;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
+import javax.sql.DataSource;
 import java.util.Collection;
 import java.util.Map;
 
@@ -33,9 +34,11 @@ public interface PrivilegeLoadAlgorithm extends 
ShardingSphereAlgorithm {
     /**
      * Load privileges.
      * 
-     * @param metaDataList meta data list
+     * @param schemaName schema name
+     * @param dataSources data sources
+     * @param rules rules
      * @param users users
-     * @return map of users and privileges
+     * @return user and privileges map
      */
-    Map<ShardingSphereUser, ShardingSpherePrivilege> 
load(Collection<ShardingSphereMetaData> metaDataList, 
Collection<ShardingSphereUser> users);
+    Map<ShardingSphereUser, ShardingSpherePrivilege> load(String schemaName, 
Collection<DataSource> dataSources, Collection<ShardingSphereRule> rules, 
Collection<ShardingSphereUser> users);
 }
diff --git 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
index ad7b428..ab0a2bb 100644
--- 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
+++ 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
@@ -28,6 +28,7 @@ import 
org.apache.shardingsphere.infra.metadata.auth.model.user.ShardingSphereUs
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 
+import javax.sql.DataSource;
 import java.util.Collection;
 
 /**
@@ -39,14 +40,12 @@ public final class AuthorityRule implements 
ShardingSphereRule {
         ShardingSphereServiceLoader.register(PrivilegeLoadAlgorithm.class);
     }
     
-    private final PrivilegeLoadAlgorithm privilegeLoader;
-    
-    public AuthorityRule(final AuthorityRuleConfiguration config, final 
Collection<ShardingSphereUser> users, final Collection<ShardingSphereRule> 
builtRules) {
+    public AuthorityRule(final AuthorityRuleConfiguration config, 
+                         final String schemaName, final Collection<DataSource> 
dataSources, final Collection<ShardingSphereUser> users, final 
Collection<ShardingSphereRule> builtRules) {
         Preconditions.checkState(1 == config.getPrivilegeLoaders().size(), 
"Only support one privilege loader.");
-        privilegeLoader = 
ShardingSphereAlgorithmFactory.createAlgorithm(config.getPrivilegeLoaders().values().iterator().next(),
 PrivilegeLoadAlgorithm.class);
-        Authentication authentication = new DefaultAuthentication();
-        // TODO pass correct parameters
-        authentication.init(privilegeLoader.load(null, users));
+        PrivilegeLoadAlgorithm privilegeLoader = 
ShardingSphereAlgorithmFactory.createAlgorithm(config.getPrivilegeLoaders().values().iterator().next(),
 PrivilegeLoadAlgorithm.class);
+        Authentication authentication = null == 
AuthenticationContext.getInstance().getAuthentication() ? new 
DefaultAuthentication() : 
AuthenticationContext.getInstance().getAuthentication();
+        authentication.init(privilegeLoader.load(schemaName, dataSources, 
builtRules, users));
         AuthenticationContext.getInstance().init(authentication);
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java
 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java
index 8e78e63..573e6d1 100644
--- 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java
+++ 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java
@@ -37,7 +37,7 @@ public final class AuthorityRuleBuilder implements 
ShardingSphereRuleBuilder<Aut
     @Override
     public AuthorityRule build(final String schemaName, final Map<String, 
DataSource> dataSourceMap, final DatabaseType databaseType, 
                                final AuthorityRuleConfiguration ruleConfig, 
final Collection<ShardingSphereUser> users, final 
Collection<ShardingSphereRule> builtRules) {
-        return new AuthorityRule(ruleConfig, users, builtRules);
+        return new AuthorityRule(ruleConfig, schemaName, 
dataSourceMap.values(), users, builtRules);
     }
     
     @Override
diff --git 
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/auth/GovernanceAuthenticationContext.java
 
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/auth/GovernanceAuthenticationContext.java
index 67e77be..57f2abe 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/auth/GovernanceAuthenticationContext.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/auth/GovernanceAuthenticationContext.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.governance.core.event.model.auth.PrivilegeChang
 import 
org.apache.shardingsphere.governance.core.event.model.auth.UserRuleChangedEvent;
 import 
org.apache.shardingsphere.infra.context.metadata.MetaDataAwareEventSubscriber;
 import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.auth.Authentication;
 import org.apache.shardingsphere.infra.metadata.auth.AuthenticationContext;
 import org.apache.shardingsphere.infra.metadata.auth.builder.PrivilegeBuilder;
@@ -98,9 +99,10 @@ public final class GovernanceAuthenticationContext 
implements MetaDataAwareEvent
     
     private void reloadPrivilege(final Collection<ShardingSphereUser> users) {
         Authentication authentication = 
AuthenticationContext.getInstance().getAuthentication();
-        Optional<PrivilegeLoader> loader = 
PrivilegeLoaderEngine.findPrivilegeLoader(metaDataContexts.getMetaDataMap().values().iterator().next().getResource().getDatabaseType());
+        DatabaseType databaseType = 
metaDataContexts.getMetaDataMap().values().iterator().next().getResource().getDatabaseType();
+        Optional<PrivilegeLoader> loader = 
PrivilegeLoaderEngine.findPrivilegeLoader(databaseType);
         if (loader.isPresent()) {
-            Map<ShardingSphereUser, ShardingSpherePrivilege> privileges = 
PrivilegeBuilder.build(metaDataContexts.getMetaDataMap().values(), users);
+            Map<ShardingSphereUser, ShardingSpherePrivilege> privileges = 
PrivilegeBuilder.build(databaseType, 
metaDataContexts.getMetaDataMap().values(), users);
             
authentication.getAuthentication().putAll(getPrivilegesWithPassword(authentication,
 privileges));
         }
         AuthenticationContext.getInstance().init(authentication);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/PrivilegeBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/PrivilegeBuilder.java
index fd663e9..efe9928 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/PrivilegeBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/PrivilegeBuilder.java
@@ -19,12 +19,14 @@ package 
org.apache.shardingsphere.infra.metadata.auth.builder;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.auth.builder.loader.PrivilegeLoader;
 import 
org.apache.shardingsphere.infra.metadata.auth.builder.loader.PrivilegeLoaderEngine;
 import 
org.apache.shardingsphere.infra.metadata.auth.model.privilege.ShardingSpherePrivilege;
 import 
org.apache.shardingsphere.infra.metadata.auth.model.user.ShardingSphereUser;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
 import javax.sql.DataSource;
 import java.util.Collection;
@@ -54,15 +56,17 @@ public final class PrivilegeBuilder {
     /**
      * Build privileges.
      *
+     * @param databaseType database type
      * @param metaDataList meta data list
      * @param users users
      * @return privileges
      */
-    public static Map<ShardingSphereUser, ShardingSpherePrivilege> build(final 
Collection<ShardingSphereMetaData> metaDataList, final 
Collection<ShardingSphereUser> users) {
+    public static Map<ShardingSphereUser, ShardingSpherePrivilege> build(final 
DatabaseType databaseType, 
+                                                                         final 
Collection<ShardingSphereMetaData> metaDataList, final 
Collection<ShardingSphereUser> users) {
         if (metaDataList.isEmpty()) {
             return createDefaultPrivileges(users);
         }
-        Optional<PrivilegeLoader> loader = 
PrivilegeLoaderEngine.findPrivilegeLoader(metaDataList.iterator().next().getResource().getDatabaseType());
+        Optional<PrivilegeLoader> loader = 
PrivilegeLoaderEngine.findPrivilegeLoader(databaseType);
         return loader.map(optional -> build(metaDataList, users, 
optional)).orElseGet(() -> createDefaultPrivileges(users));
     }
     
@@ -76,9 +80,24 @@ public final class PrivilegeBuilder {
     }
     
     private static Map<ShardingSphereUser, ShardingSpherePrivilege> 
build(final ShardingSphereMetaData metaData, final 
Collection<ShardingSphereUser> users, final PrivilegeLoader loader) {
-        Map<ShardingSphereUser, Collection<ShardingSpherePrivilege>> result = 
load(metaData.getResource().getAllInstanceDataSources(), users, loader);
+        return build(metaData.getName(), 
metaData.getResource().getAllInstanceDataSources(), 
metaData.getRuleMetaData().getRules(), users, loader);
+    }
+    
+    /**
+     * Build privileges.
+     * 
+     * @param schemaName schema name
+     * @param dataSources data sources
+     * @param rules rules
+     * @param users users
+     * @param loader privilege loader
+     * @return privileges
+     */
+    public static Map<ShardingSphereUser, ShardingSpherePrivilege> build(final 
String schemaName, final Collection<DataSource> dataSources, 
+                                                                         final 
Collection<ShardingSphereRule> rules, final Collection<ShardingSphereUser> 
users, final PrivilegeLoader loader) {
+        Map<ShardingSphereUser, Collection<ShardingSpherePrivilege>> result = 
load(dataSources, users, loader);
         checkPrivileges(result);
-        return PrivilegeMerger.merge(result, metaData.getName(), 
metaData.getRuleMetaData().getRules());
+        return PrivilegeMerger.merge(result, schemaName, rules);
     }
     
     private static Map<ShardingSphereUser, 
Collection<ShardingSpherePrivilege>> load(final Collection<DataSource> 
dataSources, 
@@ -91,7 +110,7 @@ public final class PrivilegeBuilder {
         }
         futures.forEach(each -> {
             try {
-                fillShardingSpherePrivileges(result, each);
+                fillPrivileges(result, each);
             } catch (final InterruptedException | ExecutionException | 
TimeoutException ex) {
                 throw new IllegalStateException(String.format("Error while 
loading privilege with %s", each), ex);
             }
@@ -100,16 +119,6 @@ public final class PrivilegeBuilder {
         return result;
     }
     
-    private static void fillShardingSpherePrivileges(final 
Map<ShardingSphereUser, Collection<ShardingSpherePrivilege>> userPrivilegeMap, 
-                                                     final 
Future<Map<ShardingSphereUser, ShardingSpherePrivilege>> future) throws 
InterruptedException, ExecutionException, TimeoutException {
-        for (Entry<ShardingSphereUser, ShardingSpherePrivilege> entry : 
future.get(FUTURE_GET_TIME_OUT_MILLISECONDS, TimeUnit.MILLISECONDS).entrySet()) 
{
-            if (!userPrivilegeMap.containsKey(entry.getKey())) {
-                userPrivilegeMap.put(entry.getKey(), new LinkedHashSet<>());
-            }
-            userPrivilegeMap.get(entry.getKey()).add(entry.getValue());
-        }
-    }
-    
     private static Map<ShardingSphereUser, ShardingSpherePrivilege> 
createDefaultPrivileges(final Collection<ShardingSphereUser> users) {
         Map<ShardingSphereUser, ShardingSpherePrivilege> result = new 
LinkedHashMap<>(users.size(), 1);
         ShardingSpherePrivilege privilege = new ShardingSpherePrivilege();
@@ -118,8 +127,18 @@ public final class PrivilegeBuilder {
         return result;
     }
     
-    private static void checkPrivileges(final Map<ShardingSphereUser, 
Collection<ShardingSpherePrivilege>> result) {
-        for (Entry<ShardingSphereUser, Collection<ShardingSpherePrivilege>> 
entry : result.entrySet()) {
+    private static void fillPrivileges(final Map<ShardingSphereUser, 
Collection<ShardingSpherePrivilege>> userPrivilegeMap,
+                                       final Future<Map<ShardingSphereUser, 
ShardingSpherePrivilege>> future) throws InterruptedException, 
ExecutionException, TimeoutException {
+        for (Entry<ShardingSphereUser, ShardingSpherePrivilege> entry : 
future.get(FUTURE_GET_TIME_OUT_MILLISECONDS, TimeUnit.MILLISECONDS).entrySet()) 
{
+            if (!userPrivilegeMap.containsKey(entry.getKey())) {
+                userPrivilegeMap.put(entry.getKey(), new LinkedHashSet<>());
+            }
+            userPrivilegeMap.get(entry.getKey()).add(entry.getValue());
+        }
+    }
+    
+    private static void checkPrivileges(final Map<ShardingSphereUser, 
Collection<ShardingSpherePrivilege>> userPrivilegeMap) {
+        for (Entry<ShardingSphereUser, Collection<ShardingSpherePrivilege>> 
entry : userPrivilegeMap.entrySet()) {
             for (ShardingSpherePrivilege each : entry.getValue()) {
                 if (each.isEmpty()) {
                     throw new ShardingSphereException(String.format("There is 
no enough privileges for %s on all database instances.", 
entry.getKey().getGrantee()));
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/metadata/MetaDataContextsBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/metadata/MetaDataContextsBuilder.java
index 5159b7d..3576cc8 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/metadata/MetaDataContextsBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/metadata/MetaDataContextsBuilder.java
@@ -159,7 +159,8 @@ public final class MetaDataContextsBuilder {
     
     private Authentication buildAuthentication(final 
Collection<ShardingSphereUser> users, final Map<String, ShardingSphereMetaData> 
metaDataMap) {
         DefaultAuthentication result = new DefaultAuthentication();
-        result.init(PrivilegeBuilder.build(metaDataMap.values(), users));
+        DatabaseType databaseType = metaDataMap.isEmpty() ? 
DatabaseTypeRegistry.getActualDatabaseType("MySQL") : 
metaDataMap.values().iterator().next().getResource().getDatabaseType();
+        result.init(PrivilegeBuilder.build(databaseType, metaDataMap.values(), 
users));
         return result;
     }
 }

Reply via email to