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;
}
}